You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)不一致,导致读取不到值。

解决步骤

  1. 确认字段名的准确拼写:先打印完整的文档数据,查看字段名的真实情况:
    console.log('完整文档数据:', JSON.stringify(doc.data(), null, 2));
    
  2. 修正字段名匹配:将代码中所有players替换为文档实际的字段名(比如Players)。
  3. 修复响应重复发送问题:原代码中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:47:26