在查询字符串

时间:2016-02-21 22:13:17

标签: 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);
    });

});

这不起作用(我得到了整个系列)..

router.get('/', function(req,res) {
    console.log(req.query.q)
    myModel.find(req.query.q, function(err,data){
        if(err) console.log(err)
        res.json(data);
    });

});

有了这个请求

/api/myModel?q={name:"test e"}

我不认为这是一个网址编码问题,因为我打印'q'var并且它看起来很好服务器端。

附带问题:如果这不是标准模式,查询数据库的RESTful标准方法是什么?

编辑以获取更多一般细节: 我不需要通过身份或名称进行简单访问,比如Ashley B建议,我需要一个适当的搜索引擎用于我的数据库(用户,使用图形网络界面,必须能够分别查询每个字段,可能)

编辑2: 感谢Blakes Seven我解决了我最初的问题,但如果您知道或使用更好的方法来执行复杂的查询,我很乐意讨论。 也许我应该公开其他资源“/ api / seach”?

3 个答案:

答案 0 :(得分:2)

我建议你使用一些库来解析查询字符串到mongoDB查询。它可以解决您的问题并使您的代码更好。

querymen可以帮助您将/myModel?q=test+e转换为{name: 'test e'},让您完全控制查询字符串架构。

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

答案 1 :(得分:1)

我想我可以通过回答你的第二个问题回答你的第一个问题。(

假设你有一个用户模型,通常你有一个端点来获取所有用户,如下所示:

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

因此,您只需使用特定的部分,而不是通过查询字符串传递整个查询。允许用户使用自己的查询直接访问您的数据会使安全性变得更加困难。

答案 2 :(得分:0)

正确的查询应如下所示:

/api/myModels?name=test%20e

myModals部分是复数形式。

点击此处:How to design RESTful search/filtering?