从 IncomingMessage 中读取数据而不消耗 Node.js (Hapi.js)

Read data from IncomingMessage without consuming in Node.js (Hapi.js)

在 Node.js 服务器中,请求是 IncomingMessage. In turn, IncomingMessage implements the Readable Stream 接口的实例。

如果我们想输出整个请求体,我们应该这样实现:

req.on('data', chunk => {
   console.log(chunk.toString());
});

但是,这段代码消耗了流中的数据,我需要将数据保留在流中以便稍后使用。有没有办法在不消耗数据的情况下从流中读取数据?

如果不是,是否可以将数据重新排队以进行流式传输?

就我而言,我使用的是 Hapi.js。可以通过 request.raw.req 访问请求流。我的代码如下所示:

const server = Hapi.server({ port: 3000, host: 'localhost' });

server.route({
    method: 'POST',
    path: '/',
    handler: (request, h) => {
        var req = request.raw.req;    // Get the IncomingMessage

        req.on('data', chunk => {
           console.log(chunk.toString());
        });
        return 'Hello, world!';
    }
});
server.start();

添加以下路由选项就可以了:

options: {
    payload: {
        output: 'data',
        parse: false
    }
}

这会强制 Hapijs 读取有效负载并将其输出为数据,i。即,request.payload 将是 Buffer 而不是流。

解析选项是可选的。当设置为 false 时,Hapijs 将忽略请求的内容类型并且不会尝试解析它。