【问题标题】:Node.js Hapi route pathNode.js Hapi 路由路径
【发布时间】:2017-08-25 15:51:38
【问题描述】:

我需要在 Hapi 服务器上匹配以下路由:

http://localhost:8080/messages/{deviceId}/?deviceType=phone
|___________________||________||_________||_______________|
           1              2          3            4

详情:

  • 1 是我的服务器网址
  • 2 是 路径
  • 3 是一个名为 deviceId 的参数,它会根据请求而有所不同。
  • 4 是一个查询参数,由请求的发射器附加。我不控制这个附加的查询参数,但我知道它总是会匹配 ?deviceType=phone

我尝试执行以下操作,但 Hapi 服务器甚至没有启动..

server.route({
    method: 'POST',
    path: config.serverPath + '/messages/{deviceId}/?deviceType=phone',

    handler: (request, reply) => {

    }
});

然后我尝试了这个:

server.route({
    method: 'POST',
    path: config.serverPath + '/messages/{deviceId*2}',

    handler: (request, reply) => {

        const parameters = request.params.deviceId.split('/');
        const deviceId = parameters[0];
        const attachedQueryParameter = parameters[1]; // should match '?deviceType=phone'
    }
});

{deviceId*2} 表示只有提供 2 个参数时,路由才会匹配。 然后我可以轻松提取参数。

当参数以“?”开头时,这条路线几乎可以正常工作。 (错误 404)... ...这正是我想要匹配的情况(请求的组件 n° 4 以'?'开头)。

谁能帮我解决这个棘手的问题?谢谢


再次尝试,仍然出现 404 错误...我的路径设置为:

path: config.serverPath + '/messages/{deviceId}'

如果我用这个 URL 做一个 POST 就可以了:

http://localhost:8080/messages/7d8a09d37d1e7b?deviceType=phone

但是如果我用这个做一个 POST:

http://localhost:8080/messages/7d8a09d37d1e7b/?deviceType=phone

它不起作用... 404 错误,说“未找到”。 我正在使用 hapi v15.0.1。


我找到了一个温度。此路径的解决方案:

path: config.serverPath + '/messages/{deviceId*}'

它适用于上述两个请求,但对于第二个请求,request.params.deviceId 在最后包含一个“/”字符...

【问题讨论】:

    标签: javascript node.js routing hapijs


    【解决方案1】:

    你可以设置路径

    path: config.serverPath + '/messages/{deviceId}'
    

    并使用request.query获取查询参数。

    【讨论】:

    • 我已经尝试过了,如果我执行以下请求,这条路线会出现 404 错误:localhost:8080/messages/658734-2384635-373/?deviceType=phone
    • 但是如果我删除路径参数和查询参数之间的“/”,路由就可以工作:localhost:8080/messages/658734-2384635-373?deviceType=phone
    • 它对我有用。请记住,您的端点是作为 POST 实现的。如果您使用 GET 方法请求端点,它会给您 404。
    【解决方案2】:

    你可以这样做。无需编写 cofig.serverPath。此外,您必须使用 Joi 来验证查询参数。

    path: '/messages/{deviceId}',
    handler: storyController.getAllPaginatedStories,
    config: {
        validate: {
            query: {
                deviceType: Joi.string().required().valid(['phone']),
            }
       }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-22
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 2019-07-20
      • 2021-12-14
      相关资源
      最近更新 更多