Mongoose将变量定义为数字,但req.query中的值在引号中。我该如何处理?

时间:2014-02-06 17:51:28

标签: node.js mongoose

还没有Node / Mongoose的经验。

给出这样的浏览器查询:

www.example.com/systems?properties.max_diameter=24

并且Mongoose架构是:

var SystemSchema = new Schema({
    ....
    properties:       {
        max_diameter: { type: Number,  required: true}
    }
});

module.exports = mongoose.model('System',  SystemSchema);

使用console.log(req.query),我知道Node控制器看到了:

req.query = { 'properties.max_diameter': '24' }

注意该值是单引号。

因此,此查询失败:

System.find(req.query).sort(sort_param).find(function(err, systems) {        
    res.send(systems);
});

但是如果我对这个值进行硬编码以便我有这个:

System.find({'properties.max_diameter': 24}).sort(sort_param).find(function(err, systems) {        
    res.send(systems);
});

完美无缺。

当然,删除引号很容易,但我不可能知道将使用的各种查询组合。我以为Mongoose会以某种方式解决这个问题,但我无法弄清楚我错过了什么或做错了什么。

提前感谢您的帮助。

干杯。

1 个答案:

答案 0 :(得分:0)

我相信你知道,请求是作为HTTP请求正文中的字符串而来的。这意味着您需要在提交到Mongoose之前将数字的字符串表示形式转换为数字对象。我可以理解为什么你会觉得Mongoose会自动执行此操作,但我可以想到几个需要相反效果的用例。虽然大多数项目都使用Mongoose和HTTP服务器,但您可以使用Mongoose编写许多其他类型的应用程序。

要解决此问题,只需在路线中使用parseInt()转换为数字对象,然后再使用req.query对象进行搜索。

req.body.max_diameter = parseInt(req.max_diameter);

System.find(req.query).sort(sort_param).find(function(err, systems) {        
  res.send(systems);
});

您还可以设置中间件功能来全局处理此问题。