簡體   English   中英

從Firebase實時數據庫流式傳輸數據

[英]Streaming data from Firebase Realtime Database

我的實時數據庫中有超過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實時數據庫流式傳輸數據?

編輯:那是怎么重復的? 這是兩個完全不同的問題。 起始代碼相同,但是我要解決的方法完全不同

實時數據庫沒有任何流API。 當您執行查詢時,整個結果集總是一次性加載到內存中。

一種可能的替代方法是使用limitToFirst()以及一些查詢順序來翻頁結果,該查詢順序使您可以在處理第一批項目后執行后續查詢,從最后一個查詢中斷的地方開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM