Firebase云函数操作Firestore报项目资源Permission denied错误
问题原因
- 权限错误来自你手动实例化的Firestore客户端没有配置合法的访问凭证,云函数运行环境下Firebase Admin SDK已经自动完成了权限配置,不需要单独引入
@google-cloud/firestore包新建实例 - 未处理的Promise拒绝是因为
try/catch只能捕获同步代码异常,你调用firestore.add返回的是异步Promise,链路上没有配置catch捕获异常,同时forEach中的批量写入操作没有等待完成就返回响应,也可能导致执行异常
解决步骤
步骤1:替换Firestore实例化逻辑
删除以下冗余代码:
const Firestore = require("@google-cloud/firestore"); const PROJECTID = "[...]"; const firestore = new Firestore({ projectId: PROJECTID, timestampsInSnapshots: true, });
替换为Admin SDK自带的Firestore实例:
const firestore = admin.firestore();
步骤2:修复异步异常捕获逻辑
推荐改用async/await写法,同时等待所有写入操作完成后再返回响应,修改后的完整函数代码如下:
exports.createNewChat = functions.region("europe-west1") .https.onRequest(async (request, response) => { console.log("!!!!!!"); console.log("THe BodY: " + request); console.log("THe BodY: " + request.rawBody); console.log("THe BodY: " + request.body); try { const groupName = request.body.groupName; const members: string[] = request.body.members; // 等待聊天文档创建完成 const doc = await firestore.collection("chats").add({ groupName: groupName, members: members, lastMessage: new Date(), messages: [], }); const chatId = doc.id; // 等待所有用户的myChats文档写入完成 await Promise.all(members.map((member) => { return firestore.collection("myChats/" + member).add({ chatKey: chatId, }); })); return response.status(200).send(doc); } catch (e) { functions.logger.log("catch clause " + e); response.status(500).send(e); } });
额外说明
如果是本地模拟器运行时报错,需要先执行firebase login登录你的Firebase账号,确保本地调试环境有权限访问项目的Firestore资源。
内容的提问来源于stack exchange,提问作者IveGotAQuestion
相关产品推荐
相关产品推荐

