【问题标题】:How to check if there is any payload (POST) data in a request with hapijs?如何使用 hapijs 检查请求中是否有任何有效负载(POST)数据?
【发布时间】:2015-04-02 23:00:38
【问题描述】:

这就是我所拥有的:

server.route({
        method: 'POST',
        path: '/somePath/',
        config: {
          payload:{
                output: 'stream'
            }
        });

我希望有一个简短的 XML,这就是我使用“流”而不是“数据”的原因。我使用FakeToe 作为XML 解析器,因为它是基于流的,在我的处理函数中我调用request.payload.pipe(parser)。我只想检查请求中是否有任何 POST 数据,如果没有,则将错误的请求发送回用户。

我曾考虑过在request.payload 流中获取数据的大小,但如果不先拉动然后将数据推回流中,这样做似乎并不简单,这是我不喜欢的。

当数据存在时,一切都正常工作,但如果不是,FakeToe 不会调用回调函数并显示流为空的错误。另外,我不想自己调用request.payload.read方法只是为了检查是否有任何数据。

在 hapijs 中有什么方法可以做到这一点?

【问题讨论】:

  • 我想你有content-length 标题?您可以从request.headers 进行检查,而不是读取有效负载
  • @tgo 感谢这个简单的解决方案!我想我需要了解 HTTP 基础知识!将此添加为答案,我会接受!
  • 很高兴它有帮助。我已经回答了,谢谢。

标签: javascript node.js validation hapijs


【解决方案1】:

您可以使用Joi 来验证有效负载的存在。它是 Hapi 提供的模式和验证模块。它会自动验证在端点接收到的任何请求,如果验证失败,则会回复适当的 badRequest 消息。

var Joi = require('Joi');

server.route({
        method: 'POST',
        path: '/somePath/',
        config: {
          payload:{
                output: 'stream'
            }
          validate: {
                payload: Joi.any().required()
            }
        });

更多关于 herehere 的信息。

编辑:

根据此 GitHub Issue 中的讨论,验证对象类似于

Joi.object({
    pipe: Joi.func().required()
}).unknown();

可以用来测试payload是否真的是一个流。

【讨论】:

  • 您建议的 Joi 验证也可以,但我相信,就我的目的而言,tgo 使用 content-length 的解决方案更简洁。
【解决方案2】:

我想你有 content-length header ?您可以从 request.headers 进行检查,而不是读取有效负载。

【讨论】:

    猜你喜欢
    • 2015-02-10
    • 2015-05-21
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 2018-07-22
    相关资源
    最近更新 更多