Firebase云函数Firestore触发器获取context.params.userId为undefined如何解决
问题根源
你当前的触发器监听路径是/trxns/{trxnId},路径通配符里只有trxnId,没有userId,所以context.params.userId自然返回undefined。
解决方案
场景1:trxns是用户下属的子集合
如果你的数据库结构是用户集合/{userId}/交易集合/{trxnId}的层级,只需要修改触发器监听路径,就可以直接从context.params取userId:
// 修改监听路径,加入userId通配符 exports.onTrxnCreate = functions.firestore.document('/users/{userId}/trxns/{trxnId}').onCreate(async(snap, context) => { // 这里就可以正常拿到userId了 const userId = context.params.userId; console.log('UserID 1: ' + userId); // 后续业务逻辑不变... });
如果你要从文档路径反向取,注意属性是小写的id不是大写的Id,之前的写法大小写错误导致失效:
const userId = snap.ref.parent.parent.id;
场景2:trxns是根路径下的独立集合
如果你的交易文档直接存在根路径的trxns集合下,且文档内存储了关联的userId字段,直接从触发的文档快照里取即可:
exports.onTrxnCreate = functions.firestore.document('/trxns/{trxnId}').onCreate(async(snap, context) => { // 从文档字段中取userId const userId = snap.data().userId; console.log('UserID 1: ' + userId); // 后续业务逻辑不变... });
额外优化建议
你代码末尾的return Promise.all(console.log('End of function'));写法是错误的,console.log返回的不是Promise对象,这行在触发时会报错,直接删掉即可,你之前的逻辑已经有对应return语句,不会走到这行。
内容的提问来源于stack exchange,提问作者LostTexan
相关产品推荐
相关产品推荐

