Потоковая передача данных из базы данных Firebase Realtime - PullRequest
0 голосов
/ 14 ноября 2018

У меня в базе данных в реальном времени более 20 тыс. Документов.Мне нужно их транслировать, но я даже не знаю, с чего начать.Это то, что я пытался использовать для

sendEmail.get('/:types/:message', cors(), async (req, res, next) => {
    console.log(5);
    const types = JSON.parse(req.params.types);
    console.log('types', types);
    let recipients = [];
    let mails = [];
    if (types.includes('students')) {
        console.log(1);
        const tmpUsers = await admin.database().ref('Users').orderByChild('student').equalTo(true).once('value').then(r => r.val()).catch(e => console.log(e));
        recipients = recipients.concat(tmpUsers);
    }
    if (types.includes('solvers')) {
        console.log(2);
        let tmpUsers = await admin.database().ref('Users').orderByChild('userType').equalTo('person').once('value').then(r => r.val()).catch(e => console.log(e));
        tmpUsers = tmpUsers.concat(arrayFromObject(await admin.database().ref('Users').orderByChild('userType').equalTo('company').once('value').then(r => r.val()).catch(e => console.log(e))));
        recipients = recipients.concat(tmpUsers);
    }
});

Но этот код заставляет мой сервер исчерпать память.Кто-то предложил потоки в моем предыдущем вопросе, но насколько мне нравится идея, я понятия не имею, как на самом деле делать потоковую передачу.Я знаю, что это должно быть что-то вроде:

const fs = require('fs');
const readStream = fs.createReadStream('path goes here');
const data = [];
readStream.on('data', chunk => {
    data.push(chunk);
})
readStream.on('end', () => {
    console.log(data);
    res.end(data);
});

Но как, черт возьми, я могу передать запрос Firebase в путь?

Я пробовал это, но он сказал Argument type Promise is not assignable to parameter type PathLike, что делаетсмысл, но как мне обойти это?

const users = fs.createReadStream(admin.database().ref('News').once('value').then(r => r.val()))

Подводя итог: Как мне передавать данные из базы данных Firebase в реальном времени?

Редактировать: Как это дубликат?Это 2 совершенно разных вопроса.Начальный код такой же, но способы решения, о которых я спрашиваю, совершенно разные

1 Ответ

0 голосов
/ 14 ноября 2018

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

Возможной альтернативой является листание результатов с использованием limitToFirst () вместе с некоторым порядком запросов, который позволяет выполнять последующий запрос после обработки первой партии элементов, выбирая, где последний запрос остановился.

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