Поток результатов MongoDB для экспресс-ответа - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь сделать это без сторонних зависимостей, так как не считаю, что они нужны.Обратите внимание, что из-за решения архитектора мы должны использовать нативный MongoDB, а не Mongoose (не спрашивайте!).

В основном у меня есть функция getAll, которая будет возвращать все документы (на основе переданных взапрос) из одной коллекции.

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

У меня есть следующий код:

db.collection('documents')
    .find(query)
    .stream({
        transform: (result) => {
            return JSON.stringify(new Document(result));
        }
    })
    .pipe(res);

Какие виды работ, кроме того, что уничтожают массив, в котором должны храниться документы, и отвечают: {...}{...}

Должен быть способ сделать это правильно?

1 Ответ

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

Что вы можете сделать, это написать явно начало массива res.write("[") перед запросом базы данных, поставить ,, на каждый строковый объект json и в конце потока записать конец массива res.write("]") thisможет работать. Но это не рекомендуется!

JSON.stringify - это очень медленная операция, вы должны стараться использовать ее как можно меньше.

Лучшим подходом будет использование поточной реализации JSON.stringify, такой как json-stream-stringify

const JsonStreamStringify = require('json-stream-stringify');
app.get('/api/users', (req, res, next) => {
   const stream = db.collection('documents').find().stream();
   new JsonStreamStringify(stream).pipe(res);
);

Помните об использовании pipe в производстве, pipe не уничтожает исходный или целевой поток при ошибках.Во избежание утечки памяти рекомендуется использовать pump или pipeline на производстве.

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