Firestore获取文档数组字段players返回undefined问题排查
Firestore获取数组字段返回undefined问题解决
问题描述
尝试从Firestore文档中获取players数组以通过POST请求更新,但调用doc.data().players或doc.get('players')始终返回undefined。调试时可见doc.data()包含所有预期字段和值,且获取doc.data().admin等其他字段正常。相关代码如下:
export const updatePlayers = async (req, res, next) => { try { const data = req.body; const roomsRef = db.collection('rooms'); const snapshot = await roomsRef.where('roomId', '==', data.roomId).get(); const player = req.body.player; if (snapshot.empty) { console.log('No matching documents.', data.roomId); res.status(201).send(); return; } console.log('updating players...'); snapshot.forEach((doc) => { const prevPlayers = doc.data().players; console.log(doc.data().players, 'previous players'); const newPlayers = [...prevPlayers, player]; console.log(newPlayers, 'new players'); doc.ref.update({ players: newPlayers, }); res.status(200).send(); console.log('players update'); }); } catch (error) { res.status(400).send(error.message); } };
问题原因及解决方法
核心原因:字段名大小写不匹配
Firestore对字段名大小写敏感,大概率是代码中使用的players(全小写)和文档实际存储的字段名(比如首字母大写的Players)不一致,导致读取不到值。
解决步骤
- 确认字段名的准确拼写:先打印完整的文档数据,查看字段名的真实情况:
console.log('完整文档数据:', JSON.stringify(doc.data(), null, 2)); - 修正字段名匹配:将代码中所有
players替换为文档实际的字段名(比如Players)。 - 修复响应重复发送问题:原代码中
snapshot.forEach内直接发送响应,若查询到多个文档会导致重复响应报错。由于roomId应是唯一标识,直接取第一个文档即可。
修正后的代码
export const updatePlayers = async (req, res, next) => { try { const { roomId, player } = req.body; const roomsRef = db.collection('rooms'); const snapshot = await roomsRef.where('roomId', '==', roomId).get(); if (snapshot.empty) { console.log('No matching documents.', roomId); return res.status(201).send(); } // 取唯一匹配的文档 const doc = snapshot.docs[0]; const docData = doc.data(); // 使用文档实际的字段名,此处假设为Players,需替换为真实名称 const prevPlayers = docData.Players || []; // 加默认值避免undefined报错 const newPlayers = [...prevPlayers, player]; await doc.ref.update({ Players: newPlayers // 匹配文档字段名 }); console.log('players update'); res.status(200).send(); } catch (error) { res.status(400).send(error.message); } };
内容的提问来源于stack exchange,提问作者slash89mf
相关产品推荐
相关产品推荐

