如何使用Hapi将数据流式传输到浏览器?
问题描述:
我试图使用流向Hapi发送数据到浏览器的数据,但无法确定我们的方式。具体来说,我使用的是request模块。根据文档reply
对象接受流,所以我试过:如何使用Hapi将数据流式传输到浏览器?
reply(request.get('https://google.com'));
引发错误。在文档它说的流对象必须与streams2兼容,所以后来我想:
reply(streams2(request.get('https://google.com')));
现在,这并不抛出一个服务器方的错误,但在浏览器的请求从不负载(使用Chrome)。
然后我尝试这样做:
var stream = request.get('https://google.com');
stream.on('data', data => console.log(data));
reply(streams2(stream));
并在控制台数据被输出,所以我知道流不是问题,而是哈皮。我如何才能在Hapi中进行流式传输?
答
尝试使用Readable.wrap
:
var Readable = require('stream').Readable;
...
function (request, reply) {
var s = Request('http://www.google.com');
reply(new Readable().wrap(s));
}
使用节点0.10.x和HAPI 8.x.x.测试在我的代码示例中,Request
是节点请求模块,而request
是传入的hapi请求对象。
UPDATE
另一种可能的解决办法是监听'response' event从Request
然后reply
与http.IncomingMessage
这是一个适当的读操作流。
function (request, reply) {
Request('http://www.google.com')
.on('response', function (response) {
reply(response);
});
}
这需要较少的步骤,并且还允许开发者传输之前用户定义的属性附加到流。这可以用于设置除200以外的状态代码。