2017-06-29 11 views
1

私はmongoノードとexpressで少し新しいです、そして、私はいくつかの問題を経験しています。私は特定のキーワードに基づいてデータベース内のすべての製品を照会しようとしています。正規表現の検索エラー

var express = require("express"), 
    mongoose = require("mongoose"); 

var productSchema = new mongoose.Schema({ 
    name: String, 
    image: String, 
    description: String, 
    keywords: String, 
}); 

モジュール:理想的には、私は言葉のどれもがコレクション

に含まれていることが判明されていない場合は、1つの製品ユーザー検索から単語を含む、固定製品をデフォルトを見つけたいここに私のスキーマのセットアップです.exports = mongoose.model( 'Product'、productSchema);

私の考えは、クエリに基づいてユーザーを商品と照合することです。彼らが完全な文章を入力したとしても(現在のところ、それは単一の単語でしか機能しません)。製品がない場合は、db内の1つの製品にデフォルト設定します。ここに私のルート設定があります:

var express = require("express"), 
    Product =require('../models/product'), 
    router = express.Router(); 

router.get('/myroute', function(req,res){ 
// if there's a query 
    if(req.query.search){ 
    const regex = new RegExp(escapeRegex(req.query.search), 'gi'); 
    var regexSearch = { 
     "keywords": { 
       "$regex": regex 
      } 
    }; 
    Product.findOne(regexSearch, function(err, foundProduct){ 
     if(err){ 
      console.log('product not found'); 
     } else{ 
      res.render('show', {product: foundProduct}); 
       } 
    }); 

    } else{ 
      Product.findOne({name: 'defaultP'}, function(err, foundProduct){   
       if(err){ 
        console.log(err); 
       } else{ 
        res.render('show', {product: foundProduct}); 
       } 
      }); 

     } 

    }); 

function escapeRegex(text) { 
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 
}; 

module.exports = router; 

現在存在するキーワードを検索すると、すべて正常に動作しますが(文章ではありません)。私は文章やDBに存在しないキーワードを検索する場合レンダリングするときしかし、私はエラーを取得する:

(/家庭でのevalでヌル のプロパティ「name」を読み取ることができません(エバール/ Ubuntuの/workspace/node_modules/ejs/lib/ejs.js:524:12)、:22:33)返信時の (/home/ubuntu/workspace/node_modules/ejs/lib/ejs.js:555:17) at [エンジンとして](/ home/ubuntu/workspace/node_modules/ejs/lib/ejs)でtryHandleCache(/home/ubuntu/workspace/node_modules/ejs/lib/ejs.js:203:34) をView.exports.renderFileに配置します。 js:412:10) at View.render(/ home/ubuntu/workspace/node_modules/express/lib/view.js:128:8) で/application.js:640:10) at EventEmitter.render(/home/ubuntu/workspace/node_modules/express/lib/application.js:592:3) at ServerResponse.render(/ home/ubuntu/workspace/node_modules) /express/lib/response.js:971:7) at /home/ubuntu/workspace/routes/match.js:20:23 at Query。 (/home/ubuntu/workspace/node_modules/mongoose/lib/model.js:3755:16) /自宅で /home/ubuntu/workspace/node_modules/mongoose/node_modules/kareem/index.js:277:21でnextTickCallbackWith0Argsで/ubuntu/workspace/node_modules/mongoose/node_modules/kareem/index.js:131:16 (のNode.js:436:9)process._tickCallbackで

(Node.jsの:13:365)
+2

エラーは、 '.findOne()'の結果が実際に何かを返すかどうかをチェックしないために発生します。それがなければ 'null'であり、あなたはチェックしないで盲目的にそれをテンプレートに送ります。結果が得られない理由は、 '.replace()'で行なわれている文字列の "マングリング"です。あなたがそこで何をしようとしているのかはっきりしていませんが、私の出力はデータベースに格納されている "文"と一致しないようです。 Hey Neil。 –

+0

私はこれが理由であることを知っています....ちょうどテンプレートに送信する前に結果を確認する方法を混乱させる。検索条件がどの製品にも一致しない場合は、dbからmydefault製品を探してテンプレートにロードしたいと思っています... –

+0

'if(foundProduct!= null) 'を返し、' else'は「見つからない」応答を返します。私が言ったように、 '。replace()は、各単語の末尾に '\\'を追加するだけなので意味がありません。私はあなたのデータがそのように格納されているのか疑問です。 –

答えて

0

これを試して、関数escapeRegexをRegExpの中に入れてください。

var regExpr = new RegExp(".*" + req.query.search + ".*", "i"); 
var regexSearch = { 
    "keywords": regExpr 
}; 
0

これに従ってください。

var str = ""; 
var searchResult = ""; 

str = new RegExp(".*" + req.query.search + ".*", "i"); 

searchResult = { "keywords": str };