我正在做一个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)
答案 0 :(得分:5)
答案 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
。
尝试一下!
答案 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)
因此,我只是进行了 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 request
是createScreams
端点,而对于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",