Firebase Cloud Functions报错:TypeError: 无法读取undefined的'map'属性
解决Firebase Cloud Functions中QuerySnapshot.map报错的问题
这个错误TypeError: Cannot read property 'map' of undefined其实是个很常见的API误用问题——你搞错了Firestore QuerySnapshot的属性名,正确的属性是docs,而不是documents。
问题根源
Firebase Admin SDK的QuerySnapshot对象里,用来存储查询结果文档数组的属性是**docs**,而非你代码里写的documents。当你尝试访问querySnapshot.documents时,这个属性根本不存在,自然会返回undefined,调用map就会触发报错。
另外,你的TypeScript类型定义也不准确:{ documents: DocumentSnapshot[] }是自定义的错误类型,应该直接使用Firebase官方提供的QuerySnapshot类型,这样TypeScript会帮你自动校验属性是否正确。
修正后的代码
下面是调整后的完整代码,我已经替换了正确的属性名,并修正了类型定义:
import { QuerySnapshot, DocumentSnapshot } from 'firebase-admin/firestore'; // 你的其他初始化代码(比如admin.initializeApp())... const followerColl = admin.firestore().collection('Users').doc(updatersUserId).collection('followers'); return followerColl.get().then((querySnapshot: QuerySnapshot) => { // 改用querySnapshot.docs获取文档数组 const promises = querySnapshot.docs.map((doc: DocumentSnapshot) => { const followerUid = doc.id; return admin.firestore().collection('Users').doc(followerUid).collection('followers') .doc(updatersUserId).set({ name: newName, userName: newUserName, profilePhotoChosen: profilePhotoChosen, uid: updatersUserId }); }); return Promise.all(promises); });
可选优化:使用async/await让代码更清晰
如果你习惯用async/await语法,代码会更易读,避免嵌套的then回调:
// 确保你的函数是async函数 export const updateFollowerProfiles = async (/* 你的参数 */) => { const followerColl = admin.firestore().collection('Users').doc(updatersUserId).collection('followers'); const querySnapshot = await followerColl.get(); const promises = querySnapshot.docs.map(doc => { const followerUid = doc.id; return admin.firestore().collection('Users').doc(followerUid).collection('followers') .doc(updatersUserId).set({ name: newName, userName: newUserName, profilePhotoChosen: profilePhotoChosen, uid: updatersUserId }); }); return Promise.all(promises); };
这样修改后,querySnapshot.docs会返回一个有效的DocumentSnapshot数组,map操作就能正常执行,不会再出现undefined的错误了。
内容的提问来源于stack exchange,提问作者Anudeep Ananth
相关产品推荐
相关产品推荐

