【问题标题】:How can I consume a stream of json chunks from http endpoint?如何使用来自 http 端点的 json 块流?
【发布时间】:2016-09-06 22:20:27
【问题描述】:

我有一个将 json 对象流式传输到端点的服务器。这是一个简化的例子:

app.get('/getJsonObjects', function (req, res) {
    res.write(JSON.stringify(json1));
    res.write(JSON.stringify(json2));
    res.write(JSON.stringify(json3));
    res.write(JSON.stringify(json4));
    res.write(JSON.stringify(json5));
    res.end();
});

然后客户端使用浏览器请求,我正在尝试这样做:

var r = request(url);
r.on('data', function(data) {
    console.log(JSON.parse(data));
});

问题是尽管流式传输到有效字符串化 JSON 的端点块,我从请求中返回的块只是文本块,不一定与发送的 JSON 块的开始/结束对齐服务器。这意味着 JSON.parse(data) 有时会失败。

以与写入端点相同的方式流式传输这些 json 块的最佳方式是什么?

【问题讨论】:

标签: node.js stream


【解决方案1】:

这是一个异步问题。您提供的服务器代码不能保证按该顺序发送数据。

您要么必须在客户端累积块并确定客户端上块的显示顺序,要么您必须在服务器端执行某种累加器方法,然后按顺序输出 JSON随着它们的处理。

编辑: 看来 res.write 可以采用“分块”编码类型。所以尝试将 header 字段设置为 chunked,然后在 res.write() 的编码参数中指定“chunked”。 https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback

如果这失败了,你可以使用 res.write 的回调参数做一个巨大的回调/承诺链来保证 res.write() 的顺序。

【讨论】:

  • 我会尝试“分块”。另外,为了澄清我实际上并不关心我的写入顺序与我的读取顺序相同,只是当我在客户端上流式传输结果时,我可以将结果解析为有效的 json。
  • 如果是这种情况,那么您要么必须使用分块编码,要么必须在客户端确定顺序。
  • 不幸的是,我认为这行不通。我在写入之前在服务器代码中设置了res.setHeader('Transfer-Encoding', 'chunked');,但在尝试解析客户端流中返回的数据时,我仍然看到同样的情况。
  • 对于回调/承诺问题,请尝试async mapSeries
猜你喜欢
  • 2017-11-18
  • 2019-10-10
  • 2011-01-26
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 2020-04-23
相关资源
最近更新 更多