如何编写Firebase云函数监听集合变动更新mail集合并触发邮件?
Firestore 价格阈值触发邮件云函数修复方案
需要修正的问题如下:
onWrite触发器返回的change对象需要通过after属性获取触发后的最新文档数据,原代码直接调用change.data()无法正确取值- 整数转换方法拼写错误,
ParsInt应为全小写开头的parseInt price_change是文档字段属性不是方法,不需要加调用括号- 异步操作(写入mail集合)没有返回Promise,会导致云函数提前终止,写入操作可能执行失败
- 缺少空值校验,当触发场景是文档删除时会导致取值报错
修复后的完整代码:
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); // 确保已正确初始化admin exports.btcMail = functions.firestore .document('cryptos/Bitcoin/1h/{wildcard}') .onWrite((change, context) => { // 取写入后的最新文档数据 const newval = change.after.data(); // 空值判断:如果是删除操作直接返回 if (!newval) return null; console.log(newval); // 修正拼写和字段调用方式 const price = parseInt(newval.price_change); // 增加数值合法性校验,避免转换失败后判断逻辑异常 if (isNaN(price)) return null; if (price < -200) { // 返回异步操作的Promise return admin.firestore().collection('mail').add({ to: 'someone.someone@gmail.com', message: { subject: 'big change in bitcoin prices!', html: 'This is an <code>HTML</code> email body.', }, }); } // 不满足触发条件直接返回 return null; });
补充注意事项:
- 部署前请确认你已经在Firebase控制台正确安装配置了Trigger Email扩展,且扩展拥有mail集合的读写权限
- 如果price_change字段可能包含非数字字符,可根据需要调整parseInt的转换逻辑,避免转换后出现NaN的情况
- 测试时可以在Cloud Function日志中查看打印的newval值,确认字段取值是否符合预期
内容的提问来源于stack exchange,提问作者srikanth
相关产品推荐
相关产品推荐

