У меня есть страница, где пользователи могут вводить свою информацию. Когда пользователь нажимает «Сохранить», я упаковываю все в объект и отправляю его в свою облачную функцию с помощью 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().
Вещи, которые я пытался сделать:
У меня есть проверка на стороне сервера, чтобы убедиться, что объект подходит (непустой, содержит допустимые поля...).
Я использовал промежуточное ПО express.json().
Я использовал упрощенную версию своего объекта данных для тестирования, но она все еще не работала. Пример ниже; фактический объект тот же, но длиннее.
obj = {
id: "123",
name: "John",
age: "24"
}
Кнопка «Сохранить» срабатывает несколько раз, если пользователь уходит со страницы и возвращается. Однако я хочу, чтобы пользователь мог сохранять, редактировать что-либо и снова сохранять на той же странице.
Щелчок по другой задаче облачной функции (у меня есть кнопка «Загрузить») и повторная попытка нажать кнопку «Сохранить» также не работает.
-Мой код на стороне клиента:
// 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.info(err);
console.info(err.stack);
}
})
// save the dataObj into firestore
function saveToFireStore(dataObj) {
db.collection("myCollection").doc(dataObj.id).set(dataObj);
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


проверьте, как вы упаковываете объект. только что столкнулся с этим в своем собственном проекте и обнаружил, что данные API, которые я собирал, на самом деле имели объект с пустым ключом:
{ items: { '': [Object], A: [Object], B: [Object], C: [Object] }, size: 4 }
Удаление этого первого элемента из объекта элементов «устранило» ошибку создания для меня.
Это то, что происходило со мной :)