2017-06-29 59 views
1

我有点新的mongo节点和表达,我遇到一些问题。我试图根据某些关键字在数据库中查询所有产品。理想情况下,我想找到一个用户搜索包含单词一个产品,并默认为一个固定的产品,如果没有的话被发现包含集合正则表达式搜索错误

在这里,是我的架构设置:

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

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

模块.exports = mongoose.model('Product',productSchema);

我的想法是根据用户的查询来匹配用户和产品。即使他们输入一个完整的句子(目前它只能用单个单词)。如果没有产品,我想在数据库中默认为一个产品。这里是我的路线设置:

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; 

目前一切工作正常,当我搜索关键字存在(但不是一个句子)。但是,如果我搜索一个句子或不存在于数据库中的关键字,我渲染时出现错误:

在EVAL无法读取空 的特性“名称”(在(/家EVAL/Ubuntu的/workspace/node_modules/ejs/lib/ejs.js:524:12),:22:33) at returnedFn(/home/ubuntu/workspace/node_modules/ejs/lib/ejs.js:555:17) at在View.exports.renderFile [作为引擎](/ home/ubuntu/workspace/node_modules/ejs/lib/ejs)处使用tryHandleCache(/home/ubuntu/workspace/node_modules/ejs/lib/ejs.js:203:34) 。 js:412:10) at View.render(/home/ubuntu/workspace/node_modules/express/lib/view.js:128:8) at tryRender(/ home/ubuntu/workspace/node_modules/express/lib /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) at /home/ubuntu/workspace/node_modules/mongoose/node_modules/kareem/index.js:277:21 at/home /ubuntu/workspace/node_modules/mongoose/node_modules/kareem/index.js:131:16 在nextTickCallbackWith0Args(node.js中:436:9) 在process._tickCallback(node.js中:365:13)

+2

产生该错误是因为您只是不检查'.findOne()'的结果是否实际返回了某些内容。当它不是那么它是'空',你不检查,但只是盲目地发送到模板。我怀疑没有结果的原因是用'.replace()'完成字符串的“修改”。不知道你打算在那里做什么,但输出给我看起来不太可能匹配存储在数据库中的任何“句子”。 –

+0

嘿尼尔。我知道这是原因....只是困惑于如何检查结果发送到模板之前。我想将发现的产品发送到模板...如果搜索条件不匹配任何产品,那么我想从数据库中找到mydefault产品并将其加载到模板中... –

+0

'if(foundProduct!= null)'和你的'else'返回一个“not found”响应。就像我说的那样。替换()'这里没有任何意义,因为它只是将'\\'附加到每个单词的末尾,我怀疑你的数据是否以这种方式存储。 –

回答

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 };