使用来自 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);
});
...
所以我正在使用 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);
});
...