Cloud Firestore文档添加给出错误“参数“ data”的值不是有效的Firestore文档。无法将“ undefined”用作Firestore值”

时间:2019-09-15 12:26:26

标签: javascript firebase google-cloud-functions postman

我正在做一个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)

11 个答案:

答案 0 :(得分:5)

确保在使用邮递员更改为POST方法时,在url下方的正文部分上,单击raw选项,然后在最有可能显示Text的下拉列表中将其更改为JSON。 enter image description here

答案 1 :(得分: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上三个属性中的至少一个未定义。错误消息告诉您哪个:

  

不能使用“ undefined”作为Firestore值(在字段正文中找到)

因此,body属性是未定义的。您需要调试函数并弄清楚为什么req.body.body未定义。也许客户没有传递那个价值。

答案 2 :(得分:1)

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

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

您可能会误以为屏幕可以看到。单击URL输入位置下的body tag。然后选择raw。最后切换到JSON,您的问题将得到解决。 将JSON数据写在下图中的红线中。

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

尝试一下!

enter image description here

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我也遇到了这个问题。

原来我犯的错误是

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

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

{
  'body':'new',
  'UserHandle': 'new'
}

发出的请求具有UserHandle大写。

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

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我的案例的问题是使用 userHandle ,而在用户中我使用的是 handle 。我只是将尖叫贴中的值从userHandle重命名为公正处理,如下所示:

之前

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 :(得分:0)

Postman Image

因此,我只是进行了 firebase部署,而不是 firebase服务 ,并且一切正常,并且能够添加newScream。

答案 8 :(得分:0)

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

对于每个firebase函数,应该有一个唯一的终结点

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

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

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

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

现在您应该在邮递员中使用的链接post requestcreateScreams 端点,而对于get request,您需要使用getScreams端点

您遇到的错误并不重要,因为该过程需要客户端输入一些数据,但是您需要使用正确的端点将文档成功发送到Firestore

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

<块引用>

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

而不仅仅是给予时间价值

<块引用>

"createdAt": "10:00pm",