如何使用 Hapi 将数据流式传输到浏览器?
How do I stream data to browsers with Hapi?
我正在尝试使用流通过 Hapi 将数据发送到浏览器,但无法弄清楚我们的方法。具体来说,我正在使用 request 模块。根据文档,reply
对象接受一个流,所以我尝试过:
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。如何在 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 请求对象。
更新
另一种可能的解决方案是从 Request
监听 'response' event,然后使用 http.IncomingMessage
监听 reply
,这是一个正确的读取流。
function (request, reply) {
Request('http://www.google.com')
.on('response', function (response) {
reply(response);
});
}
这需要更少的步骤,并且还允许开发人员在传输之前将用户定义的属性附加到流。这在设置 200 以外的状态代码时很有用。
2020
我找到了!!问题是gzip
压缩
要仅针对 event-stream
禁用它,您需要向 Happi
服务器提供下一个配置
const server = Hapi.server({
port: 3000,
...
mime:{
override:{
'text/event-stream':{
compressible: false
}
}
}
});
在处理程序中我使用 axios
因为它支持新的流 2 协议
async function handler(req, h) {
const response = await axios({
url: `http://some/url`,
headers: req.headers,
responseType: 'stream'
});
return response.data.on('data',function (chunk) {
console.log(chunk.toString());
})
/* Another option with h2o2, not fully checked */
// return h.proxy({
// passThrough:true,
// localStatePassThrough:true,
// uri:`http://some/url`
// });
};
我正在尝试使用流通过 Hapi 将数据发送到浏览器,但无法弄清楚我们的方法。具体来说,我正在使用 request 模块。根据文档,reply
对象接受一个流,所以我尝试过:
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。如何在 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 请求对象。
更新
另一种可能的解决方案是从 Request
监听 'response' event,然后使用 http.IncomingMessage
监听 reply
,这是一个正确的读取流。
function (request, reply) {
Request('http://www.google.com')
.on('response', function (response) {
reply(response);
});
}
这需要更少的步骤,并且还允许开发人员在传输之前将用户定义的属性附加到流。这在设置 200 以外的状态代码时很有用。
2020
我找到了!!问题是gzip
压缩
要仅针对 event-stream
禁用它,您需要向 Happi
服务器提供下一个配置
const server = Hapi.server({
port: 3000,
...
mime:{
override:{
'text/event-stream':{
compressible: false
}
}
}
});
在处理程序中我使用 axios
因为它支持新的流 2 协议
async function handler(req, h) {
const response = await axios({
url: `http://some/url`,
headers: req.headers,
responseType: 'stream'
});
return response.data.on('data',function (chunk) {
console.log(chunk.toString());
})
/* Another option with h2o2, not fully checked */
// return h.proxy({
// passThrough:true,
// localStatePassThrough:true,
// uri:`http://some/url`
// });
};