Как передать JSON объектов из ExpressJS? - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь передать JSON объектов из ExpressJS / Node backend API на веб-сайт.

Я не хочу использовать Sockets.IO по разным причинам. Насколько я понимаю, собственные библиотеки потоковой передачи должны поддерживать объекты потоковой передачи, похоже, что только Express усложняет это.

Мой код внешнего интерфейса прямолинейен. Я использую Fetch, чтобы получить свой целевой URL, получить поток чтения из объекта ответа и установить для этого потока чтения значение objectMode: true.

Пример внешнего интерфейса:

    async function () {

      let url = "myurl";

      let response = await fetch( url, {
        method: 'GET',
        mode: 'cors',
        wtihCredentials: 'include'
      }

      const reader = response.body.getReader({objectMode: true });

      // Where things are a bit ambiguous
      let x = true;
      while (x) {
        const {done, value} = reader.read()
        if (done) { break; }

        // do something with value ( I push it to an array )

      }      
}

Пример Backend Bode ( сбой из-за того, что я не могу изменить поток на objectMode)

router.get('/', (request, response) => {

  response.writeHead(200, { 'Content-Type' : 'application/json' });

  MongoDB.connection.db.collection('myCollection').find({}).forEach( (i) => {
    response.write(i);
  }).then( () => {
    response.end()
  })
})

Теперь моя проблема в том, что, похоже, нет возможности изменить ExpressJS поток записи на objectMode: true. К моему ужасу, документация ExpressJS даже не подтверждает существование функции write () в объекте ответа: https://expressjs.com/en/api.html#res

Как мне изменить это перейти к objectMode: true?

наоборот, я попытался работать с writeStream как строкой. Проблема, с которой я столкнулся, заключается в том, что когда буфер отправки заполняется, он делает это по символам, а не по объекту. Это означает, что в какой-то момент запрашивающей стороне передается недопустимый JSON.

Предлагаемое решение, с которым я часто сталкиваюсь, заключается в том, что я мог бы прочитать все фрагменты на клиенте и собрать действительный JSON. Это противоречит цели потоковой передачи, поэтому я пытаюсь найти лучший способ.

Я считаю, что это та же проблема, я не могу понять, как напрямую разговаривать с объектом потока записи из кода express поэтому я не могу использовать собственную операцию writeStream Writable.length, чтобы вручную проверить, есть ли место для всего объекта JSON в виде строки. Это мешает мне использовать строковый JSON с новыми терминаторами строки.

https://nodejs.org/api/stream.html#stream_writable_writablelength

https://nodejs.org/api/stream.html#stream_writable_writableobjectmode

Может ли кто-нибудь меня поправить? Я работаю с более чем 100 тысячами записей в моей базе данных Mon go, мне действительно нужна частичная загрузка страницы, чтобы пользователи могли начать выбирать данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...