从Firebase实时数据库流式传输数据

时间:2018-11-14 09:56:19

标签: javascript node.js firebase firebase-realtime-database stream

我的实时数据库中有超过2万个文档。我需要流式传输它们,但是我什至不确定如何开始使用它。这就是我想要的那种

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实时数据库流式传输数据?

编辑: 副本如何?这是两个完全不同的问题。起始代码相同,但是我要解决的方法完全不同

1 个答案:

答案 0 :(得分:1)

实时数据库没有任何流API。当您执行查询时,整个结果集总是一次性加载到内存中。

一种可能的选择是使用limitToFirst()以及一些查询顺序来翻页结果,这些查询顺序使您可以在处理第一批项目后执行后续查询,从最后一个查询中断的地方开始。< / p>