如何使用 hapijs 检查请求中是否有任何负载 (POST) 数据?

How to check if there is any payload (POST) data in a request with hapijs?

这是我的:

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

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

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

当数据存在时一切正常,但如果不存在,FakeToe 不会调用回调函数并出现错误,指出流为空。另外,我不想自己调用 request.payload.read 方法来检查是否有任何数据。

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

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

var Joi = require('Joi');

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

有关此内容的更多信息 here and here

编辑:

根据此 GitHub Issue 中的讨论,验证对象如

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

可用于测试负载是否真的是一个流。

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