Как отправить поток объекта json клиенту? - PullRequest
0 голосов
/ 11 декабря 2018

Это может быть повторяющийся вопрос, но не могу найти никакого решения там.Я уже пытался найти его в эти быстрые часы, но мне не повезло.

Мой вопрос - как я могу отправить stream (idk, если stream - правильный термин) изjson возражает против клиента.

Пример Я читаю данные в БД, и на каждых 5 найденных записях я отправляю данные клиенту в формате json.Затем прочитайте данные на клиенте, используя Angular httpclient lib.

Я уже пробовал expressjs response.write(), но клиент не смог получить данные, пока я не позвоню response.end().

Что такоеправильный способ сделать это?

Я думал о socket.io, но это было бы излишним.

Edit

Другой пример

function getData(res: Response, req: Request):void {
  for(let i = 0; i<100; i++{
    res.write(JSON.stringify({data:1}) + '\n');
  }

  res.end(); // There is data received on the browser until this was called.
}

Или как то так.Я ожидал, что данные будут поступать каждую 1 секунду, но они появлялись в одно и то же время после 10 секунд.

function getData(res, req){
  const s = setInterval(()=>{
    res.write(JSON.stringify({value: 'test value'}));
  }, 1000);

  setTimeout(()=>{
    clearInterval(s);
    res.end();
  }, 10000);
}

1 Ответ

0 голосов
/ 11 декабря 2018

Итак, я обнаружил, что приведенный выше пример кода не имеет проблем, а также является правильным способом сделать это.

Когда я попытался открыть URL-интерфейс API непосредственно в браузере, я вижучто браузер получает данные.

Проблема связана с угловой библиотекой httpclient, которую я использую для извлечения данных. Она покажет данные, если все уже загружено.

Но, к счастью, янашел этот пакет oboe.js , он может делать то, что я хочу для потоковой передачи данных json.Поэтому, когда экспресс js отправит данные через * 1009, * oboe сможет извлечь данные и быть готовым к использованию.

Вы можете сделать это так просто.

oboe('your url').node('!', data=>{
  // process your data here.
  // the '!' selector means that oboe will just show the data if it is a valid json.
});
...