Firestore:重复的firestore.set()导致错误:索引0处的元素不应为空字符串

时间:2019-06-22 03:29:00

标签: javascript firebase express google-cloud-firestore google-cloud-functions

我有一个页面,用户可以在其中输入他们的信息。当用户单击“保存”时,我会将所有内容打包到一个对象中,然后使用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);
}

1 个答案:

答案 0 :(得分:0)

查看如何包装对象。刚在我自己的项目中遇到了这个问题,发现我抓取的API数据确实有一个带有空键的对象:

<div id="background"></div>
<div id="content"><a href="#">Anchor</a></div>

从items对象中删除第一个元素“为我解决了创建错误。”