我有一个页面,用户可以在其中输入他们的信息。当用户单击“保存”时,我会将所有内容打包到一个对象中,然后使用AJAX将其发送到我的云函数中。在那里,我使用Express框架设置了服务器,并将数据保存到Firestore中。
当我单击“保存”时,一切正常。我的数据显示在Firestore中,没有错误。但是,当我编辑数据并再次单击“保存”(仍在同一页面上)时,在服务器端出现此错误:
Error: Element at index 0 should not be an empty string.
at new FieldPath (C:\Users\Me\Documents\myProject\functions\node_modules\@google-cloud\firestore\build\src\path.js:440:23)
at validateDocumentData (C:\Users\Me\Documents\myProject\functions\node_modules\@google-cloud\firestore\build\src\write-batch.js:625:16)
at WriteBatch.set (C:\Users\Me\Documents\myProject\functions\node_modules\@google-cloud\firestore\build\src\write-batch.js:242:9)
at DocumentReference.set (C:\Users\Me\Documents\myProject\functions\node_modules\@google-cloud\firestore\build\src\reference.js:337:27)
at saveToFireStore (C:\Users\Me\Documents\myProject\functions\index.js:101:47)
这是我在客户端遇到的错误:
localhost:5001/myProject/us-central1/app:1 POST http://localhost:5001/myProject/us-central1/app
415 (Unsupported Media Type)
请注意,这不是我第一次单击“保存”按钮时发生的。无论是否更改数据,都会发生此错误。只要多次单击“保存”,该错误就会一直出现。
特别注意:我没有在代码中使用批处理语句,但错误显示了对WriteBatch()的调用
我尝试做的事情:
我在服务器端进行了检查,以确保obj符合条件(非空,包含有效字段...)。
我使用了express.json()中间件。
我使用了数据对象的简化版本进行测试,但仍然无法正常工作。示例如下。实际对象是相同的,但更长。
obj = {
id: "123",
name: "John",
age: "24"
}
如果用户离开页面并返回,“保存”按钮将不止一次工作。但是,我希望用户能够保存,编辑任何内容,然后再次保存在同一页面上。
单击另一个Cloud功能任务(我有一个“下载”按钮),然后重试“保存”按钮也不起作用。
-我在客户端的代码:
// extract data from input fields
let dataObj = getDisplayedData();
// I also tested using this
// let dataObj = {
// id: "123",
// name: "John",
// age: "24"
//}
let xhttp = new XMLHttpRequest();
const url = "cloud/function/url";
xhttp.open("POST", url);
xhttp.setRequestHeader("Content-Type", "application/json");
xhttp.send(JSON.stringify(dataObj));
-我在服务器端的代码:
const functions = require('firebase-functions'),
admin = require('firebase-admin'),
express = require('express'),
serviceAccount = require("./serviceAccountKey.json");
const app = express();
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://my_data_base.firebaseio.com"
});
const db = admin.firestore();
app.use(express.json());
app.post('/', (req, res) => {
let dataObj = req.body;
try {
// check if obj is empty or missing keys
checkDataObj(dataObj);
saveToFireStore(dataObj);
let msg = "Data Saved!";
res.status(201).send(msg);
}
catch(err) {
res.status(415).send(err.message);
console.log(err);
console.log(err.stack);
}
})
// save the dataObj into firestore
function saveToFireStore(dataObj) {
db.collection("myCollection").doc(dataObj.id).set(dataObj);
}
答案 0 :(得分:0)
查看如何包装对象。刚在我自己的项目中遇到了这个问题,发现我抓取的API数据确实有一个带有空键的对象:
<div id="background"></div>
<div id="content"><a href="#">Anchor</a></div>
从items对象中删除第一个元素“为我解决了创建错误。”