У меня есть страница, где пользователи могут вводить свою информацию. Когда пользователь нажимает «Сохранить», я упаковываю все в объект и отправляю его в свою облачную функцию с помощью 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"
}
Кнопка «Сохранить» работает более одного раза, если пользователь уходит со страницы и возвращается. Однако я хочу, чтобы пользователь мог сохранять, редактировать что-либо и снова сохранять на той же странице.
Нажатие на другое задание функции 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);
}