Firestore云函数报错:无法读取undefined的'userId'属性
解决Cloud Functions触发Firestore onCreate时的
Cannot read property 'userId' of undefined错误 看起来你遇到的这个错误是因为代码里尝试访问context.params.userId,但context.params是undefined导致的,大概率是Firebase Functions版本的参数结构不匹配引发的问题,我来帮你一步步解决:
一、修正触发器参数结构
Firebase Functions的触发器参数结构在v1.0.0版本前后有明显变化,这是问题的核心原因:
情况1:使用v1.0.0以下的旧版本
如果你的firebase-functions是旧版本,onCreate触发器只会传入一个event对象,参数需要从event.params获取,同时文档数据可以直接从event.data读取,无需额外查询Firestore:
exports.welcomeEmail = functions.firestore.document('Users/{userId}').onCreate((event) => { // 从event对象中获取userId const userId = event.params.userId; // 直接从触发器事件中获取用户数据,省去一次Firestore查询 const user = event.data.data(); const msg = { to: user.email, from: 'cybertronjc3@gmail.com', subject: 'Welcome to COFOZ', templateId: '1c455865-4529-4ae1-8e5a-9a5b8eaf0157', substitutionsWrappers: ['{{', '}}'], substitutions: { name: user.name } }; return sgMail.send(msg) .then(() => console.log('email sent!')) .catch(err => console.log(err)); });
情况2:使用v1.0.0及以上的新版本
新版本的onCreate触发器会传入两个参数:snap(文档快照)和context(上下文对象),这时候context.params是有效的,但我们可以优化代码,直接用snap.data()获取文档数据,不用再额外查询Firestore:
exports.welcomeEmail = functions.firestore.document('Users/{userId}').onCreate((snap, context) => { // 从context对象中获取userId const userId = context.params.userId; // 直接从文档快照中获取用户数据 const user = snap.data(); const msg = { to: user.email, from: 'cybertronjc3@gmail.com', subject: 'Welcome to COFOZ', templateId: '1c455865-4529-4ae1-8e5a-9a5b8eaf0157', substitutionsWrappers: ['{{', '}}'], substitutions: { name: user.name } }; return sgMail.send(msg) .then(() => console.log('email sent!')) .catch(err => console.log(err)); });
二、确保本地与部署的依赖版本一致
有时候本地开发用的是新版本,但部署时用的是旧版本,也会导致参数不匹配:
- 查看本地
firebase-functions版本:在项目根目录运行npm list firebase-functions - 升级到最新版本:运行
npm install firebase-functions@latest --save - 重新部署函数:运行
firebase deploy --only functions
额外优化说明
你原来的代码在触发onCreate后,又去Firestore查询了一次用户文档,这其实是多余的——onCreate触发器已经把刚创建的文档数据通过snap(或旧版本的event.data)传递给你了,直接读取就能拿到用户信息,这样可以减少一次数据库调用,提升函数的响应速度。
内容的提问来源于stack exchange,提问作者Jagdish Choudhary
相关产品推荐
相关产品推荐

