Firebase Cloud Functions嵌套then写法报错:需添加catch或返回值
解决Firebase云函数Promise链的"expects a catch or return here"错误
你的问题核心是Promise链没有正确返回和错误处理,Firebase云函数依赖Promise跟踪异步操作的完成状态,同时ESLint的规则要求所有Promise必须被显式返回或捕获错误,避免出现未处理的异步操作。我们一步步来修正:
问题分析
你原来的代码存在三个关键问题:
- 内部的
push()操作Promise没有返回给外层then(),导致外层Promise不会等待日志写入完成就提前结束 - 整个函数没有返回最外层的
set()Promise,云函数无法感知异步操作的完成状态 - 存在拼写错误:
tinestampOfTransaction→timestampOfTransaction(会导致日志时间戳字段无效)
修正后的代码
// 确保整个函数返回最外层Promise,让云函数跟踪异步流程 return snapshot.after.ref.parent.parent.child('liquidAssets').set(newLiquidAssets) .then(() => { // 返回push操作的Promise,保证日志写入完成后才进入下一个then return snapshot.after.ref.parent.parent.child('transactions').push({ timestamp: timestampOfTransaction, // 修正拼写错误 transaction: transaction, stock: tickerSymbol, volume: sharesToBuy, price: currPrice }); }) .then(() => { // 日志写入完成后返回1 return 1; }) .catch((error) => { // 必须添加catch块处理所有可能的错误(比如数据库权限、网络故障) console.error('Transaction processing failed:', error); // 抛出错误让云函数标记执行失败 throw error; });
关键修改说明
- 返回最外层Promise:整个函数返回
set()的Promise,确保云函数等待整个异步链完成后再结束 - 返回内部Promise:在第一个
then()里返回push()的Promise,让Promise链按顺序执行(先更新资产,再写入日志) - 添加catch块:捕获链中任何环节的错误,既满足ESLint的规则要求,也能让云函数正确处理失败场景
- 修正拼写错误:修复时间戳字段的拼写,保证日志数据的正确性
这样修改后,代码会严格按照你的预期执行:资产更新完成后写入交易日志,日志写入成功后返回1,所有异步操作都被正确跟踪,ESLint的报错也会消失。
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

