如何最好地将URL查询参数从hapi传递到Mongoose

时间:2016-04-07 03:29:50

标签: mongoose hapijs

我有一台hapi服务器,通过mongoose连接到mongodb,还有一个简单的模型,例如:用户。

我想启用用户过滤功能,例如

User.find(req.query, function () {...});

其中req.query将从URL解析,并且类似于:

{count: {$gt: 10, $lt: 100}} 

任何人都可以建议使用哪种查询解析器库和URL参数语法组合,如果有任何可用的话?

这似乎应该是一个常见的问题,但我一直无法找到现有的解决方案...

编辑:

当然,我喜欢通用解决方案,并且避免为每个模型手动解析一组固定的参数。

2 个答案:

答案 0 :(得分:1)

您可以使用Joi来验证查询参数。它很容易与Hapi集成。并且不需要添加任何特殊的查询字符串解析。参数在request.query对象上可用。您可以通过request.params对象访问path parameters

当您使用Joi时,如果任何参数检查失败,将在调用路由处理函数之前返回错误响应。简单的例子:

var User = require('./UserModel');
var joi = require('joi');

var getUsersRoute = {
    method: 'GET',
    path: '/users/{user_id?}',
    config: {
        validate: {
            params: {
                user_id: joi.number().optional().default(null)
            },
            query: {
                count: joi.number().min(10)
            }
        }
    },
    handler: function(request, reply) {
        if(request.params.user_id){
            /* do something with the id if you want to */
        }

        User.find(request.query, function(results) {
            reply(results);
        });

    }
};

另请查看Validation上的页面。它是如何运作的很好的细分。

答案 1 :(得分:-1)

你可以这样做:

var url = require('url');

function(req,res){

  //parse query params using node url module
  //url is a core node module, no npm install needed
  var params = url.parse(req.url, true).query;

  //query database using params
  User.find({userId:params.userId})...

}

这将按以下格式解析端点:

http://someApi.com?userId=MyId&param2=OtherParam...etc

所需的代码量非常少,您可能需要稍微格式化params以满足mongoose查询指南,但实际上并不需要框架。