Cloud Firestore 文档添加给出错误“参数“数据”的值不是有效的 Firestore 文档。不能使用“未定义”作为 Firestore 值”

Posted

技术标签:

【中文标题】Cloud Firestore 文档添加给出错误“参数“数据”的值不是有效的 Firestore 文档。不能使用“未定义”作为 Firestore 值”【英文标题】:Cloud Firestore document add gives error "Value for argument "data" is not a valid Firestore document. Cannot use "undefined" as a Firestore value" 【发布时间】:2020-01-16 12:53:56 【问题描述】:

我正在做一个 react 项目,这是我的第一个 react 项目。此代码已成功部署。但是在使用邮递员进行测试时会出现一些错误。我“发布”“createScream”函数的 URL 并发送它。然后我得到了这个错误。

非常感谢您对解决问题的任何帮助。我是反应世界的新手。这是我的 index.json 文件

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

admin.initializeApp();

// // Create and Deploy Your First Cloud Functions
// // https://firebase.google.com/docs/functions/write-firebase-functions
//
 exports.helloWorld = functions.https.onRequest((request, response) => 
  response.send("Hello world");
 );

 exports.getScreams = functions.https.onRequest((req, res)=> 
     admin
     .firestore()
     .collection('screams')
     .get()
     .then(data=>
         let screams =[];
         data.forEach(doc =>
             screams.push(doc.data());
         );
         return res.json(screams);
     )
     .catch((err)=> console.error(err));
 );

 exports.createScream = functions.https.onRequest((req, res)=> 
    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);

    );

我收到此错误消息

Error: Value for argument "data" is not a valid Firestore document. Cannot use "undefined" as a Firestore value (found in field body).
    at Object.validateUserInput (E:\survival\TF2\functions\node_modules\@google-cloud\firestore\build\src\serializer.js: 273: 15)
    at Object.validateDocumentData (E:\survival\TF2\functions\node_modules\@google-cloud\firestore\build\src\write-batch.js: 611: 22)
    at CollectionReference.add (E:\survival\TF2\functions\node_modules\@google-cloud\firestore\build\src\reference.js: 1765: 23)
    at exports.createScream.functions.https.onRequest (E:\survival\TF2\functions\index.js: 38: 6)
    at Run (C:\Users\User\AppData\Roaming\npm\node_modules\firebase-tools\lib\emulator\functionsEmulatorRuntime.js: 608: 20)
    at C:\Users\User\AppData\Roaming\npm\node_modules\firebase-tools\lib\emulator\functionsEmulatorRuntime.js: 582: 19
    at Generator.next (<anonymous>)
    at C:\Users\User\AppData\Roaming\npm\node_modules\firebase-tools\lib\emulator\functionsEmulatorRuntime.js: 7: 71
    at new Promise (<anonymous>)
    at __awaiter (C:\Users\User\AppData\Roaming\npm\node_modules\firebase-tools\lib\emulator\functionsEmulatorRuntime.js: 3: 12)

【问题讨论】:

欢迎来到 ***!也许阅读this 和this :) 错误提示您正在发送和undefined 值。您可以在 POST 中粘贴您发送的正文吗? 只要确保在通过邮递员发送请求时添加 Content-Type:application/json 标头 如果您使用 Postman 发出请求,则不清楚这与 React 有何关系。 @ErandiDilshani 它与 firebase.json 无关 :) 。我说的是邮递员。您需要指定 Content-Type:application/json 标头 learning.getpostman.com/docs/postman/sending_api_requests/… 【参考方案1】:

问题在于这段代码:

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

admin
.firestore()
.collection('screams')
.add(newScream)

当您尝试将文档添加到其中一个属性值为 undefined 的 Cloud Firestore 时,您将收到此错误。这意味着newScream 上的三个属性中至少有一个是未定义的。错误信息告诉你是哪一个:

不能将“未定义”用作 Firestore 值(在字段正文中找到)

所以,body 属性是未定义的。您需要调试您的函数并找出为什么 req.body.body 未定义。也许客户端没有传递那个值。

【讨论】:

这应该被标记为正确答案。就我而言,我有一个未定义的 ID。我想还有一种忽略未定义值的新方法,因为错误消息现在显示“如果您想忽略未定义值,请启用ignoreUndefinedProperties。”但是在哪里甚至可以启用此功能? 太棒了!谢谢。至少可以说,错误消息非常不清楚......【参考方案2】:

我正在从事与您工作相同的项目。我遇到了同样的错误,只需重写 createdScream 代码,重新启动邮递员并创建新的 POST 请求。 然后发送新的请求。这行得通。

【讨论】:

【参考方案3】:

确保在使用 postman 更改为 POST 方法时,在 url 下方的 body 部分,单击 raw 选项,然后在最有可能显示 Text 的下拉列表中,将其更改为 JSON。

【讨论】:

对我来说,我在 BODY 选项卡下将“raw”更改为“x-www-form-urlencoded”,它起作用了。在此之前,我试图从 Params 部分而不是 Body 部分发布。【参考方案4】:

我也遇到过这个问题。

原来我犯的错误是在

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

req.body.userHandle 中的 userHandle 在邮递员 json 中具有小写 user


  'body':'new',
  'UserHandle': 'new'

发出的请求有UserHandle大写。

我通过将 js 中的 userHandle: req.body.userHandle 更改为大写来解决此问题 UserHandle: req.body.UserHandle.

确保const newScream 中的任何内容与您尝试在邮递员 json 中发送的内容完全匹配。

【讨论】:

【参考方案5】:

我有同样的问题,我通过在 Postman 的方法“POST”的正文中选择“x-www-form-urlencoded”找到了另一个替代解决方案。修改键和值然后发送。

【讨论】:

【参考方案6】:

我的问题是使用 userHandle,而在用户中我使用的是 handle。我刚刚将尖叫帖子中的值从 userHandle 重命名为 just handle,见下文:

之前

const newScream = 
  body: req.body.body,
  userHandle: req.user.userHandle,
  createdAt: new Date().toISOString(),
;

修正后

const newScream = 
  body: req.body.body,
  userHandle: req.user.handle,
  createdAt: new Date().toISOString(),
;

【讨论】:

【参考方案7】:

我也尝试使用相同的编码并解决了问题。

在邮递员中,您会看到错误Cannot use "undefined" as a Firestore value (found in field body).,但没关系。因为它在您的帖子 URL 中没有任何数据。

您可能会被误认为是在屏幕上看到的。点击网址输入处下方的body tag。然后选择raw。最后切换到 JSON,您的问题将得到解决。 将JSON数据写入下图中红线处。

然后,写入 JSON 数据后,按下[send],您将能够在屏幕下方看到message :~~ successfully

试试吧!

【讨论】:

【参考方案8】:

Postman Image

所以,我只是做了 firebase deploy,而不是 firebase serve,一切正常,我可以添加 newScream。 p>

【讨论】:

【参考方案9】:

确保您在邮递员中使用正确的端点

每个 firebase 函数都应该有一个唯一的端点

例如: 对于getScreams 函数,你有一个链接

https://us-central1-chat-app-xmx.cloudfunctions.net/getScreams

对于createScreams 函数,您将有另一个链接,例如:

https://us-central1-chat-app-xmx.cloudfunctions.net/createScreams

现在你应该在邮递员中使用post request 的链接是createScreams endpoint 和get request 你需要使用getScreams 端点

您得到的错误不是什么大问题,因为该过程需要客户端输入一些数据,但您需要使用正确的端点将您的文档成功发送到 firestore

【讨论】:

【参考方案10】:

检查以确保在 Postman 或您使用的任何其他 API 中选择了 JSON(application/json)。

【讨论】:

【参考方案11】:

对我来说,解决问题的方法是修复在 post 请求中赋予 createdAt 属性的值。通过为_seconds_nanoseconds 赋值:

"createdAt":"_seconds":1623472200,"_nanoseconds":0,

而不仅仅是给出时间价值

"createdAt": "10:00pm",

【讨论】:

以上是关于Cloud Firestore 文档添加给出错误“参数“数据”的值不是有效的 Firestore 文档。不能使用“未定义”作为 Firestore 值”的主要内容,如果未能解决你的问题,请参考以下文章

Cloud Firestore:将字段值添加到文档

在 Dart 的 Cloud Firestore 中添加文档后如何获取文档 ID

添加“cloud_firestore”时出现颤振错误

如何将子集合添加到 Firebase Cloud Firestore 中的文档

为啥 Firebase 数据库(Firestore)不添加文档

如何在 Cloud 函数中读取 Firestore 文档更新之前/之后的值?