Node.js 在querystring中执行mongoose查询
我正在尝试使用查询字符串执行一个简单的mongoose查询。 这很有效Node.js 在querystring中执行mongoose查询,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我正在尝试使用查询字符串执行一个简单的mongoose查询。 这很有效 router.get('/', function(req,res) { myModel.find({name:"test e"}, function(err,data){ if(err) console.log(err) res.json(data); }); }); 这不起作用(我得到了整个系列) 根据这一要求 /api/myModel?q={name:"test e"}
router.get('/', function(req,res) {
myModel.find({name:"test e"}, function(err,data){
if(err) console.log(err)
res.json(data);
});
});
这不起作用(我得到了整个系列)
根据这一要求
/api/myModel?q={name:"test e"}
我不认为这是一个url编码问题,因为我打印了'q'变量,它在服务器端看起来很好
附带问题:如果这不是标准模式,那么RESTful查询数据库的标准方式是什么
编辑以获取更一般的详细信息:
我不需要像Ashley B建议的那样通过id或姓名进行简单的访问,我需要一个适合我数据库的搜索引擎(用户使用图形web界面,必须能够单独查询每个字段,可能)
编辑2:
感谢Blakes Seven,我解决了最初的问题,但如果您知道或使用更好的方法执行复杂的查询,我很乐意讨论。也许我应该公开另一个资源“/api/seach”正确的查询应该如下所示:
/api/myModels?name=test%20e
myModals部分是复数形式
检查这里:我想我可以通过回答你的第二个(附带问题)来回答你的第一个问题 假设您有一个用户模型,通常您会有一个端点来获取所有用户,如下所示:
router.get('/users', function(req, res) {
// find all users
users.find({}, function(err, data){
if(err) console.log(err)
res.json(data);
});
});
要查找特定用户,您需要一个端点,如下所示:
router.get('/users/:name', function(req, res) {
// get the user's name from the url and find that user
users.find({name: req.params.name}, function(err, data){
if(err) console.log(err)
res.json(data);
});
});
因此,您不必通过查询字符串传递整个查询,而只需找到使用特定部分即可。允许用户通过自己的查询直接访问您的数据会使安全性变得更加困难 我建议您使用一些库将querystring解析为mongoDB查询。它将解决您的问题,并使您的代码更好 通过将
/myModel?q=test+e
转换为{name:'teste'}
,可以帮助您完全控制查询字符串模式
var querymen = require('querymen')
// querymen.middleware() defines an express middleware with querystring schema
router.get('/', querymen.middleware({
q: {
type: String,
paths: ['name']
}
}), function(req, res) {
console.log(req.querymen.query) // {name: 'test e'}
myModel.find(req.querymen.query, function(err,data){
if(err) console.log(err)
res.json(data);
});
});
对不起,我将跳过回答猫鼬相关部分,因为我没有使用该数据库。然而,现在有一个标准,在处理基于json的资源时,您可以遵循这个标准,这就是您的标题。这是一条“线”。查询不应该是“字符串”,而应该是“对象”。所以
JSON.parse(req.query.q)
将其作为一个对象。但是,允许直接从URL访问可能不是一个好主意。您的问题中还有一个输入错误,即发出的查询应该是{“name”:“test e”}
带有冒号:
而不是等号=
是的,我忘记了“name”上的引号,仅此而已,谢谢。因为在我的例子中,查询可以计算约30个值,所以我希望整个json查询使用一个querystring参数,其他参数用于分页、限制、偏移量和顺序。您认为呢?在这种情况下,您可以使用jQuery.param()之类的工具,或者编写自己的函数来实现它。
var querymen = require('querymen')
// querymen.middleware() defines an express middleware with querystring schema
router.get('/', querymen.middleware({
q: {
type: String,
paths: ['name']
}
}), function(req, res) {
console.log(req.querymen.query) // {name: 'test e'}
myModel.find(req.querymen.query, function(err,data){
if(err) console.log(err)
res.json(data);
});
});