Firestore: повторяющаяся ошибка firestore.set(): элемент с индексом 0 не должен быть пустой строкой

У меня есть страница, где пользователи могут вводить свою информацию. Когда пользователь нажимает «Сохранить», я упаковываю все в объект и отправляю его в свою облачную функцию с помощью 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);
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
812
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

проверьте, как вы упаковываете объект. только что столкнулся с этим в своем собственном проекте и обнаружил, что данные API, которые я собирал, на самом деле имели объект с пустым ключом:

{ items: { '': [Object], A: [Object], B: [Object], C: [Object] }, size: 4 }

Удаление этого первого элемента из объекта элементов «устранило» ошибку создания для меня.

Это то, что происходило со мной :)

perepm 13.08.2020 09:38

Другие вопросы по теме