【问题标题】:Can't post to firebase's database无法发布到 Firebase 的数据库
【发布时间】:2025-11-29 00:00:02
【问题描述】:

当我尝试使用邮递员将数据发布到 firebase 时,我收到此错误: 错误:参数“data”的值不是有效的 Firestore 文档。不能将“未定义”用作 Firestore 值(在字段正文中找到)。

我检查了 body 和 userHandle 以未定义的形式返回,但我不知道为什么。使用邮递员,我使用 POST 并在正文中发送这样的 json:

{
    "body": "scream 2",
    "userHandle": "user2"
}

作为原始 JSON(应用程序/json)

const functions = require('firebase-functions');

const admin = require('firebase-admin');

let firebaseConfig = {
  apiKey: '*******',
  authDomain: '******',
  databaseURL: '*****',
  projectId: '*****',
  storageBucket: '****',
  messagingSenderId: '*****',
  appId: '*******'
};

admin.initializeApp(firebaseConfig);


exports.createScream = functions.https.onRequest((req, res) => {
  if (req.method !== 'POST') {
    return res.status(400).json({ error: 'Method not allowed' });
  }
  const newScream = {
    body: req.body.body,
    userHandle: req.body.userHandle,
    createdAt: admin.firestore.Timestamp.fromDate(new Date())
  };

  admin
    .firestore()
    .collection('screams')
    .add(newScream)
    .then(doc => {
      res.json({ message: `document ${doc.id} created successfully` });
    })
    .catch(err => {
      res.status(500).json({ error: 'something went wrong' });
      console.error(err);
    });
});

【问题讨论】:

  • 您好 Vilmos,欢迎来到 *!我没有发现您明显做错的任何事情...您可以将console.log(req.body) 作为您的函数的第一行,然后将check your function logs 包含在整个身体中吗?
  • { "body":"scream", "userHandle":"user2" } 我尝试使用 express + body-parser 但我得到了同样的错误。
  • 理想时间...虽然我怀疑这会解决它 - 但我建议您通过返回您的承诺来遵循best practices to ensure your cloud function has enough time to run...意思是return admin.firestore().colle....etc...永远不知道,也许云功能之前终止它完成了“添加”新条目......所以当它确实最终“添加”新条目时,请求/响应周期已经结束......并且 req.body 现在是空的。

标签: node.js firebase google-cloud-firestore google-cloud-functions


【解决方案1】:

根据我的经验:

很多人在使用邮递员时忘记将正文更改为 JSON(默认为文本)。查看下图:

因此,如果您在右端看到 JSON,您会发现 JSON 以橙色突出显示。必须将其设置为 JSON(当然,如果您尝试推送 JSON)。默认情况下,我发现它在文本中。

剩下的关于您在问题中发布的代码是符合标准的。

我真的认为这可能会对面临类似问题的人有所帮助,因此决定提及这一点。

编码愉快。

【讨论】:

    【解决方案2】:

    错误消息表明您添加到 Firestore 文档的字段之一未定义:

      const newScream = {
        body: req.body.body,
        userHandle: req.body.userHandle,
        createdAt: admin.firestore.Timestamp.fromDate(new Date())
      };
    

    由于您显示的是我们看不到其值的所有变量,因此我们无法判断哪个变量可能未定义。您必须自行调试以确定哪个未定义,并修改您的代码以检查输入是否有效。

    【讨论】:

    • 我已经说过 body 和 userHandle 以未定义的形式返回,但我不知道为什么。输入应该是有效的。
    • 当我在 .add() 函数中使用硬编码数据时,它可以工作,但使用邮递员却不行。
    【解决方案3】:

    好吧,这有点奇怪,但在邮递员中,正文设置为原始 JSON (application/json),但我再次将其设置为 JSON(application/json),现在它可以工作了。

    【讨论】: