Я пытаюсь передать 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, мне действительно нужна частичная загрузка страницы, чтобы пользователи могли начать выбирать данные.