Hapijs查询参数未定义

时间:2016-08-29 03:50:56

标签: javascript node.js https hapijs query-parameters

我目前正在与hapi合作,而且我遇到了一个问题,我似乎找不到任何解决方案或之前提及的问题。当我发送以下请求时,我的第一个查询参数只在request.query对象中。

curl -H "Content-Type: application/json" -X PUT https://localhost:3000/lists/{username}/{listname}?token='token'&resource_id='resource_id'

{}''中的项目替换为实际名称。

我的路线目前是这样写的

server.route({
    method: 'PUT',
    path: '/lists/{username}/{listname}',
    handler: function(request, reply) {
        const username = encodeURIComponent(request.params.username);
        const listname = encodeURIComponent(request.params.listname);
        const resource_id = request.query.resource_id;
        const token = request.query.token;
        console.log(request.query);
        verify(token, username, {callback}, listname, resource_id, reply);
    }
});

console.log电话会产生

{ token: 'token' }

如果我做console.log(resource_id)我得到"未定义"在控制台中。 hapi的文档声明所有查询参数都应该在request.query对象中找到。出于某种原因,这不会发生。我查看了hapijs文档,查看了我的API调用,并且我已经阅读了人们处理查询参数的示例。知道这里发生了什么吗?

3 个答案:

答案 0 :(得分:1)

问题在于你的curl命令不是HapiJS。

尝试跑步 curl -H "Content-Type: application/json" -X PUT "https://localhost:3000/lists/{username}/{listname}?token=token&resource_id=resource_id"

查询字符串中的&符号被解释为命令的结尾。有关命令无法工作的原因,请参阅this questions answer

答案 1 :(得分:0)

问题在于发出卷曲请求。 curl请求中有&,URL不在引号中;所以&变成了一个被修改的shell来启动一个分离的进程。你的路线工作正常,只需用引号中的URL点亮卷曲

curl -H "Content-Type: application/json" -X PUT "https://localhost:3000/lists/{username}/{listname}?token='token'&resource_id='resource_id'"

答案 2 :(得分:0)

如果您想从查询参数获取数据,那么您应该在下面的代码中执行以下操作:

server.route({
    method: 'PUT',
    path: '/lists/{username}/{listname}',

    validate: {
        params: {
            username: Joi.string().min(1).max(15).required(),
            listname:Joi.string().min(1).max(15).required(),

        },
   query: {
            token:    Joi.number().integer().min(1).max(100).required(),
            resource_id: Joi.number().integer().min(1).max(100).required(),
         }
       },
    handler: function (request, reply) {
         const username = encodeURIComponent(request.params.username);
         const listname = encodeURIComponent(request.params.listname);
         const resource_id = request.query.resource_id;
         const token = request.query.token;
         console.log(request.query);
         verify(token, username, {callback}, listname, resource_id, reply);
         reply("Hello There..");
    }

您可以使用上面的代码来获取参数/查询数据。