Firebase云函数获取新创建Firestore文档ID时报错求助
问题原因
你出现报错和功能异常有两个核心问题:
admin.firestore().collection('groups')获取的是集合引用,set()方法是文档引用的专属方法,集合本身没有该方法,所以直接调用集合的set()会抛出方法不存在的错误。- Firestore所有读写操作都是异步返回Promise的,你没有做异步处理,会出现写入操作还没执行完成,云函数就提前返回的问题,导致数据写入失败。
- 额外小问题:你认证判断里的
autehnticated拼写错误,建议修正为authenticated。
正确实现方案
获取新建文档ID有两种常用方式,以下是完整可运行的修正代码:
方式1:先生成空文档引用提前拿ID(性能更优)
该方式不需要等待写入完成就能拿到自动生成的文档ID,减少等待时间:
// 回调函数加async关键字才能使用await处理异步 exports.createNewGroup = functions.https.onCall(async (data, context) => { if (!context.auth) { throw new functions.HttpsError( 'unauthenticated', 'only authenticated users can make requests!' ); } // 生成groups集合下的空文档引用,直接拿到自动生成的文档ID const groupRef = admin.firestore().collection('groups').doc(); const groupId = groupRef.id; // 等待文档写入完成 await groupRef.set(data.group); // 赋值groupId到groupMember data.groupMember.groupId = groupId; // 写入groupMembers集合,同样用await等待写入完成 await admin.firestore().collection('groupMembers').doc().set(data.groupMember); return 'All is created perfectly'; });
方式2:用add方法写入后拿ID
add()方法会自动生成文档ID并写入数据,等待异步操作完成后即可从返回的文档引用中获取ID:
// 仅展示核心逻辑,其余代码和方式1一致 const groupDoc = await admin.firestore().collection('groups').add(data.group); const groupId = groupDoc.id;
注意事项
- 所有Firestore读写操作都必须用
await等待执行完成,否则云函数会提前回收进程,导致写入丢失。 - 如果
groupMembers集合的文档需要自定义ID(比如用用户ID作为文档ID),直接在doc()方法中传入指定ID即可。
内容的提问来源于stack exchange,提问作者Mansa
相关产品推荐
相关产品推荐

