我有点新的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)
产生该错误是因为您只是不检查'.findOne()'的结果是否实际返回了某些内容。当它不是那么它是'空',你不检查,但只是盲目地发送到模板。我怀疑没有结果的原因是用'.replace()'完成字符串的“修改”。不知道你打算在那里做什么,但输出给我看起来不太可能匹配存储在数据库中的任何“句子”。 –
嘿尼尔。我知道这是原因....只是困惑于如何检查结果发送到模板之前。我想将发现的产品发送到模板...如果搜索条件不匹配任何产品,那么我想从数据库中找到mydefault产品并将其加载到模板中... –
'if(foundProduct!= null)'和你的'else'返回一个“not found”响应。就像我说的那样。替换()'这里没有任何意义,因为它只是将'\\'附加到每个单词的末尾,我怀疑你的数据是否以这种方式存储。 –