升级Cloud Functions v1.0后功能崩溃,无法读取DocumentSnapshot数据
解决Firestore onCreate触发器中snap.data()调用失败的问题
看起来你遇到的问题主要是两个点导致的,我来帮你一步步排查和修复:
1. 错误的return语句是核心问题
你当前代码最后返回的是Promise构造函数本身,而不是一个已解析的Promise实例。Cloud Functions的触发器函数要求返回一个Promise来告诉平台你的异步逻辑已经完成,否则函数可能会在执行中途被强制终止,这会导致各种奇怪的行为——包括你看到的snap.data()无法正常调用的情况。
2. 修正后的代码
把你的代码改成这样,问题应该就能解决:
exports.mFoo = functions.firestore .document('foos/{key}') .onCreate((snap, context) => { const bar = snap.data(); console.log(bar); // 返回一个已完成的Promise,告知函数执行结束 return Promise.resolve(); });
额外排查点(如果还是报错)
如果修改return语句后仍然出现snap.data is not a function的错误,可以做以下检查:
- 打印
snap的类型确认:console.log("snap类型:", typeof snap, snap instanceof functions.firestore.QueryDocumentSnapshot);onCreate的第一个参数肯定是QueryDocumentSnapshot类型,它自带data()方法,如果打印结果显示不是这个类型,可能是你的firebase-functions版本过旧,建议更新到最新稳定版:npm install firebase-functions@latest --save
后续扩展提示
如果之后你需要在触发器里执行异步操作(比如写入其他Firestore文档、调用外部API等),记得直接返回那个异步操作的Promise,比如:
exports.mFoo = functions.firestore .document('foos/{key}') .onCreate((snap, context) => { const bar = snap.data(); console.log(bar); // 示例:将数据写入另一个集合,返回这个异步操作的Promise return admin.firestore().collection('bars').add(bar); });
内容的提问来源于stack exchange,提问作者ninj4 n00b
相关产品推荐
相关产品推荐

