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

Firebase Cloud Function中async/await使用报错及Firestore查询问题

Firebase Cloud Firestore查询与async/await部署问题解决

一、原then()方法无法获取数据的原因

你用then()处理Firestore查询时,没有等待异步操作完成就执行了后续的console.log和推送逻辑。此时collectionRef只是一个未完成的Promise对象,自然拿不到实际的文档数据,而且推送逻辑也会在查询完成前触发,导致逻辑顺序错误。

二、async/await部署时ESLint报错的解决

报错Parsing error: Unexpected token =>是因为你的ESLint配置不支持ES2017引入的async箭头函数语法,调整配置即可解决:

  1. 打开functions目录下的.eslintrc.js文件(无则创建)
  2. 修改parserOptions的ecmaVersion为2017或更高版本,示例配置:
module.exports = {
  root: true,
  env: {
    es6: true,
    node: true,
  },
  parserOptions: {
    ecmaVersion: 2017, // 改为2017/2020等更高版本
  },
  extends: [
    "eslint:recommended",
    "google",
  ],
  rules: {
    quotes: ["error", "double"],
  },
};
  1. 如果是在package.json中配置ESLint,同样对应调整ecmaVersion字段。

三、修复后的完整代码

注意:代码中tokens变量需要根据你的数据结构从Job users data字段中提取,否则推送会失败;同时Cloud Function必须返回Promise,确保异步操作完成后再终止。

exports.onChatMessageCreate = functions.firestore
  .document("chat messages/{docId}")
  .onCreate(async (snapshot, context) => {
    const snapData = snapshot.data();
    const userName = snapData["userName"];
    const chatId = snapData["Chat id"];

    // 等待Firestore查询完成
    const docSnapshot = await admin.firestore().collection("chat").doc(chatId).get();
    const chatData = docSnapshot.data();
    
    // 处理文档不存在的情况
    if (!chatData) {
      console.log("目标chat文档不存在");
      return null;
    }

    // 获取目标字段"Job users data"
    const jobUsersData = chatData["Job users data"];
    console.log("Job users data:", jobUsersData);

    // 从Job users data中提取设备令牌(根据你的数据结构调整)
    const tokens = jobUsersData.map(user => user.deviceToken);

    const payload = {
      notification: {
        title: userName,
        body: snapData["Chat message"],
        sound: "default"
      },
      data: {
        click_action: "FLUTTER_NOTIFICATION_CLICK",
        message: "Sample Push Message"
      },
    };

    // 执行推送并返回结果
    try {
      const response = await admin.messaging().sendToDevice(tokens, payload);
      console.log("通知发送成功:", response);
      return response;
    } catch (e) {
      console.log("发送通知失败:", e);
      throw e; // 抛出错误以便Cloud Function记录失败状态
    }
  });

额外注意事项

  • 异步类型的Cloud Function必须返回Promise,否则Google会提前终止函数,导致查询、推送等异步操作未完成。
  • 务必处理文档不存在的场景,避免后续代码因chatData为undefined报错。
  • 修改ESLint配置后,先运行npm run lint确认无错误再执行部署。

内容的提问来源于stack exchange,提问作者user17281101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:01:06