Firebase定时函数读取Firestore报map未定义,如何不用.then实现功能?
问题修复方案
错误原因
你出现cannot read property map of undefined报错的核心原因是await关键字的位置错误:
- Firestore的
get()方法本身返回的是Promise对象,你没有在调用get()的时候加await,导致此时snapshot变量实际是一个未resolve的Promise实例,不存在docs属性,调用snapshot.docs自然返回undefined,调用map方法就会报错。 - 你把
await放在了map操作的位置,而map是同步数组方法,不需要加await。
修复后的代码
exports.checkDefaultedPledges = functions.pubsub.schedule("every 1 minutes").onRun(async (context) => { console.log("This will be run every 1 minutes!"); const time = new Date().getTime(); // 在这里给get()方法加await,拿到实际的查询快照对象 const snapshot = await db.collection("pledges").get(); // 直接遍历docs数组,不需要加await const res = snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })); console.log(res); // 后续更新操作可直接在这里写遍历逻辑,不需要.then() // 示例遍历更新逻辑: // for (const pledge of res) { // await db.collection("pledges").doc(pledge.id).update({ // // 你的更新字段 // }) // } return null; });
额外注意点
- 如果后续需要遍历条目执行更新操作,建议使用
for...of循环结合await实现串行更新,或者用Promise.all包裹所有更新操作的Promise实现并行更新,两种写法都不需要用到.then()链式调用。 - 所有Firestore异步方法(比如
get()、update()、set()等)都需要加上await关键字,避免出现Promise未resolve的问题。
内容的提问来源于stack exchange,提问作者Dijiflex
相关产品推荐
相关产品推荐

