Как обработать массив JSON Stream Response в потоковом http-запросе сервера node.js

avatar
icelemon
9 августа 2021 в 00:50
148
1
0

Ответ потока имеет вид

[{
  "id":0,
  "name":name0
}
,
{
  "id":1,
  "name":name1
}
]

если я использую функцию потока node-fetch для выборки, итерации response.body, данные фрагмента случайным образом вырезаются из объекта. И я не могу разобрать его. Я предполагаю, что node-fetch не поддерживает массив json и не может распознать [, ].

Как обработать потоковый массив json? Или любая другая сторонняя библиотека? пример кода:

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()
Источник

Ответы (1)

avatar
jorgenkg
12 августа 2021 в 05:37
1

Подход к потоковому анализу внешнего источника 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