You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Cloud Functions嵌套then写法报错:需添加catch或返回值

解决Firebase云函数Promise链的"expects a catch or return here"错误

你的问题核心是Promise链没有正确返回和错误处理,Firebase云函数依赖Promise跟踪异步操作的完成状态,同时ESLint的规则要求所有Promise必须被显式返回或捕获错误,避免出现未处理的异步操作。我们一步步来修正:

问题分析

你原来的代码存在三个关键问题:

  1. 内部的push()操作Promise没有返回给外层then(),导致外层Promise不会等待日志写入完成就提前结束
  2. 整个函数没有返回最外层的set() Promise,云函数无法感知异步操作的完成状态
  3. 存在拼写错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:27:40