一尘不染

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

node.js

我正在尝试使用流使用Hapi将数据发送到浏览器,但无法确定我们的方式。具体来说,我正在使用请求模块。根据文档,该reply对象接受流,所以我尝试了:

reply(request.get('https://google.com'));

引发错误。在文档中说流对象必须与stream2兼容,所以我尝试了:

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。我如何在Hapi中进行流式传输工作?


阅读 189

收藏
2020-07-07

共1个答案

一尘不染

尝试使用Readable.wrap

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

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

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

更新

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

function (request, reply) {

     Request('http://www.google.com')
     .on('response', function (response) {
        reply(response);
     });
}

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

2020-07-07