Облачный Firestore node.js недопустимое использование типа «object» в качестве аргумента Firestore

#node.js #firebase #google-cloud-firestore

#node.js #firebase #google-cloud-firestore

Вопрос:

Мой вопрос о том, почему я не могу передать данные в базу данных Firestore. Я запускаю код на node.js пытаюсь проанализировать данные, поступающие из моей базы данных Firestore Firebase, а затем вернуть информацию обратно в базу данных. Извлечение информации работает нормально, но при попытке передать данные обратно в базу данных продолжает появляться сообщение об ошибке, от которого я ни за что в жизни не смогу избавиться.

 if(message.type = "0") {
  console.log(0)
  db.collection("outbox").doc("messageID").set({message: "test message"})
}
  

При попытке обработать последнюю строку кода появляется следующее сообщение об ошибке:

Ошибка: аргумент «data» не является допустимым документом Firestore. Недопустимое использование типа «object» в качестве аргумента Firestore.

Моя база данных структурирована как исходящие / MessageId / message. Сообщение содержит строковое значение, и я использую admin SDK, поэтому проблемы с записью не являются проблемой. Я делаю что-то не так с передачей объекта в Firebase, но я просто не могу понять это. Я впервые работаю с облачным Firestore и node.js но я уже делал небольшие проекты на HTML / JS раньше.

Комментарии:

1. Код, которым вы поделились, нигде не использует аргумент data . Вы уверены, что это именно тот код, который вызывает эту ошибку? Если да, можете ли вы отредактировать свой вопрос, чтобы включить полную трассировку стека?

2. При комментировании 3-й строки кода ошибка исчезает. Я не могу получить трассировку стека, потому что я запускаю код на repl.it и, насколько я знаю, вы не можете этого сделать. Извините за бесполезность…

3. В таком случае, можете ли вы поделиться repl.it (или jsbin, или stackblitz, или аналогичная) ссылка, которая воспроизводит проблему?

Ответ №1:

Это похоже на внутреннюю ошибку, связанную с тем, как firestore проверяет, является ли значение массивом.

У меня такая же проблема при попытке простого

 db.collection('Test').add({ foo: 'bar' })
  

Что приводит к

 Error: Value for argument "data" is not a valid Firestore document. Invalid use of type "object" as a Firestore argument
  

Покопавшись в исходном коде firebase, я обнаружил, что они проверяют, является ли объект объектом, на основе этого теста :

 Object.getPrototypeOf(input) === Object.prototype
  

Что является ложным в некоторых средах по некоторым неизвестным причинам (в моем случае: Node v10.15.3 CLI)

В качестве обходного пути, если вам временно необходимо, чтобы это работало, вы можете отредактировать исходный код вашего модуля узла в этом файле : node_modules/@google-cloud/firestore/build/src/serializer.js

Измените функцию isPlainObject на :

 function isPlainObject(input) {
    return util_1.isObject(input);
}
  

Комментарии:

1. Примечание: Я пытался применить прототип { foo: ‘bar’} к Object.prototype, … но это не дало никакого эффекта.

2. Спасибо, что ответили на мой вопрос; Я рад узнать, что это не было проблемой с моим кодом. Я сходил с ума, пытаясь выяснить, что было не так, ха-ха.

3. Я тоже был немного без ума от этого! : P II хотел бы знать, почему изменен прототип… В моем случае, я думаю, это может быть node.js добавление некоторых данных к объектам при использовании командной строки… но совсем не уверен: D

4. Спасибо, что нашли обходной путь @Poyoman, это было невероятно неприятно