Cloud Functions读取Firestore用户文档报错:(intermediate value).then is not a function
解决Firestore查询报错及正确获取用户资料的方法
你报错的核心原因是同时混用了await和.then()——await会直接解析Promise返回查询快照,这时候再链式调用.then(),相当于给一个普通对象加then方法,自然就会报错“then is not a function”。
下面是修正后的两种写法,推荐用第一种纯await的方式,逻辑更清晰:
方式一:纯await/try-catch写法(推荐)
try { // 用await直接获取查询快照,无需链式then const snapshot = await admin.firestore().collection('users').where("username", "==", id).get(); // 处理没有找到用户的场景 if (snapshot.empty) { return { displayName: "user", photoURL: "https://nonicapp.web.app/assets/logo/1.png", username: id, bio: "" }; } // 由于username通常是唯一索引,直接取第一个匹配文档 const doc = snapshot.docs[0]; const userData = doc.data(); // 构造并返回用户信息 return { displayName: userData.displayName, photoURL: userData.photoURL, username: userData.username, bio: userData.bio }; } catch (err) { warn(err); // 异常情况返回默认用户信息 return { displayName: "user", photoURL: "https://nonicapp.web.app/assets/logo/1.png", username: id, bio: "" }; }
方式二:纯then/catch写法(不混用await)
如果习惯用Promise链式调用,就不要加await:
return admin.firestore().collection('users').where("username", "==", id).get() .then(snapshot => { if (snapshot.empty) { return { displayName: "user", photoURL: "https://nonicapp.web.app/assets/logo/1.png", username: id, bio: "" }; } const doc = snapshot.docs[0]; const userData = doc.data(); return { displayName: userData.displayName, photoURL: userData.photoURL, username: userData.username, bio: userData.bio }; }) .catch(err => { warn(err); return { displayName: "user", photoURL: "https://nonicapp.web.app/assets/logo/1.png", username: id, bio: "" }; });
额外优化说明
- 新增
snapshot.empty判断:避免查询不到用户时后续代码报错 - 用
snapshot.docs[0]替代forEach:因为username通常是唯一字段,直接取第一个结果更高效,无需遍历所有匹配项
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

