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箭头函数语法,调整配置即可解决:
- 打开functions目录下的
.eslintrc.js文件(无则创建) - 修改
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"], }, };
- 如果是在
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
相关产品推荐
相关产品推荐

