如何使用Hapi将数据流式传输到浏览器?

Cal*_*mer 9 streaming request node.js hapijs

我正在尝试使用流来使用Hapi将数据发送到浏览器,但无法确定如何使用.具体来说,我正在使用请求模块.根据文档,reply对象接受一个流,所以我尝试过:

reply(request.get('https://google.com'));
Run Code Online (Sandbox Code Playgroud)

抛出错误.在文档中它说流对象必须与streams2兼容,所以我尝试了:

reply(streams2(request.get('https://google.com')));
Run Code Online (Sandbox Code Playgroud)

现在这不会引发服务器端错误,但在浏览器中请求永远不会加载(使用chrome).

然后我尝试了这个:

var stream = request.get('https://google.com');
stream.on('data', data => console.log(data));
reply(streams2(stream));
Run Code Online (Sandbox Code Playgroud)

并且在控制台输出数据,所以我知道流不是问题,而是Hapi.我怎样才能在Hapi中获得流媒体工作?

arb*_*arb 15

尝试使用Readable.wrap:

var Readable = require('stream').Readable;
...
function (request, reply) {

  var s = Request('http://www.google.com');
  reply(new Readable().wrap(s));
}
Run Code Online (Sandbox Code Playgroud)

使用Node 0.10.x和hapi 8.xx进行测试在我的代码示例中Request是节点请求模块,request它是传入的hapi请求对象.

UPDATE

另一种可能的解决办法是监听"响应"事件Request然后replyhttp.IncomingMessage这是一个适当的读操作流.

function (request, reply) {

     Request('http://www.google.com')
     .on('response', function (response) {
        reply(response);
     });
}
Run Code Online (Sandbox Code Playgroud)

这需要更少的步骤,并且还允许开发人员在传输之前将用户定义的属性附加到流.这在设置200以外的状态代码时非常有用.