如何在 node.js 服务器流式传输 http 请求中处理 JSON 流响应数组
How to process Array of JSON Stream Response in node.js server streaming http resquest
流响应的形式为
[{
"id":0,
"name":name0
}
,
{
"id":1,
"name":name1
}
]
如果我使用node-fetch
流特征来获取,迭代response.body,块数据被随机切割对象。我无法解析它。我猜 node-fetch
不支持 json 数组,无法识别 [
、]
.
如何处理json的流数组?或者任何其他 3rd 方库?
示例代码:
const fetch = require('node-fetch');
async function main() {
const response = await fetch(url);
try {
for await (const chunk of response.body) {
console.log('----start')
console.dir(JSON.parse(chunk.toString()));
console.log('----end')}
} catch (err) {
console.error(err.stack);
}
}
main()
流式解析外部 JSON 源的一种方法是将 node-fetch
与 stream-json
结合起来解析传入数据,而不管(字符串)数据是如何分块的。
import util from "util";
import stream from "stream";
import StreamArray from "stream-json/streamers/StreamArray.js";
import fetch from "node-fetch";
const response = await fetch(url);
await util.promisify(stream.pipeline)(
response.body,
StreamArray.withParser(),
async function( parsedArrayEntriesIterable ){
for await (const {key: arrIndex, value: arrElem} of parsedArrayEntriesIterable) {
console.log("Parsed array element:", arrElem);
}
}
)
stream.pipeline()
和 async function
要求 NodeJS >= v13.10
流响应的形式为
[{
"id":0,
"name":name0
}
,
{
"id":1,
"name":name1
}
]
如果我使用node-fetch
流特征来获取,迭代response.body,块数据被随机切割对象。我无法解析它。我猜 node-fetch
不支持 json 数组,无法识别 [
、]
.
如何处理json的流数组?或者任何其他 3rd 方库? 示例代码:
const fetch = require('node-fetch');
async function main() {
const response = await fetch(url);
try {
for await (const chunk of response.body) {
console.log('----start')
console.dir(JSON.parse(chunk.toString()));
console.log('----end')}
} catch (err) {
console.error(err.stack);
}
}
main()
流式解析外部 JSON 源的一种方法是将 node-fetch
与 stream-json
结合起来解析传入数据,而不管(字符串)数据是如何分块的。
import util from "util";
import stream from "stream";
import StreamArray from "stream-json/streamers/StreamArray.js";
import fetch from "node-fetch";
const response = await fetch(url);
await util.promisify(stream.pipeline)(
response.body,
StreamArray.withParser(),
async function( parsedArrayEntriesIterable ){
for await (const {key: arrIndex, value: arrElem} of parsedArrayEntriesIterable) {
console.log("Parsed array element:", arrElem);
}
}
)
stream.pipeline()
和 async function
要求 NodeJS >= v13.10