使用来自 Firebase Realtime DB 的查询数据作为另一个函数的输入

Use query data from Firebase Realtime DB as input for another function

所以我正在使用 Firebase 实时数据库存储一些数据,并希望使用查询结果作为另一个功能的输入(生成签名 URL)。我的代码如下:

// initialize the empty list
let lista = []

// define the async function that does everything
async function queryandgeturls() {
    // make the query to the firebase realtimeDB
    await ref.orderByChild('timestamp_start').startAt(timestamp1).endAt(timestamp2).on('child_added', (snapshot) => {
        lista.push(snapshot.val().name);
    });

    // use the list as input for another function to get Signed URLs
    for (const fileName of lista) {
        const [signedUrl] = await storage.bucket(bucketName).file(fileName).getSignedUrl({
            version: 'v4',
            expires: Date.now() + 15 * 60 * 1000,
            action: 'read'
        });
        console.log(`The signed URL for ${fileName} is ${signedUrl}`);
    }
};

// call the function
queryandgeturls().catch(console.error);

到目前为止运气不好。有线索吗?

on 方法为可以重复调用的事件保持开放的侦听器,因此它不是 return 承诺(因为承诺只能解决一次)。所以你代码中的 await ref.orderByChild....on('child_added'... 没有做任何事情,这可能解释了问题。

要正确解决此问题,请使用 once('value', ...,不要将 await 和回调结合使用。

async function queryandgeturls() {
    // make the query to the firebase realtimeDB
    const results = await ref.orderByChild('timestamp_start').startAt(timestamp1).endAt(timestamp2).once('value');
    results.forEach((snapshot) => {
        lista.push(snapshot.val().name);
    });
    ...