Nodejs / Mocha - FieldValue.increment - FirebaseError: функция DocumentReference.update () вызвана с неверными данными - PullRequest
0 голосов
/ 22 января 2020

У меня есть следующий код:

ПРИМЕЧАНИЕ getDb() это обертка вокруг admin.firestore() см. Ссылку в конце вопроса для получения более подробной информации.

        let wordRef = await getDb().
            .collection(DOC_HAS_WORD_COUNT)
            .doc(word)
        await wordRef.set({ word: word, 'count': 0 })
        await wordRef.update('count', admin.firestore.FieldValue.increment(1))

Когда я его выполняю, я получаю FirebaseError: Function DocumentReference.update() called with invalid data. Unsupported field value: a custom object (found in field count)

Как увеличить значение в node js, firestore, облачных функциях?

ПРИМЕЧАНИЕ: эта проблема специфична c для тестирования Mocha, я не проверял, но, вероятно, она не будет работать в реальном env.

Проблема вызвана кодом, использующим реальное реализация в тесте, которая должна быть переопределена реализацией эмулятора, как объясняется в: https://claritydev.net/blog/testing-firestore-locally-with-firebase-emulators/

Где вы также можете найти определение getDb(), которое я использовал во фрагменте кода

1 Ответ

0 голосов
/ 22 января 2020

Следующий код заменит администратора firebase во время выполнения, только при запуске в тестовом окружении.

ПРИМЕЧАНИЕ: этот код основан на https://claritydev.net/blog/testing-firestore-locally-with-firebase-emulators/ и для полного решение, нужно сделать тот же трюк для db, как описано в ссылке

//db.js
const admin = require("firebase-admin");
let firebase;

if (process.env.NODE_ENV !== "test") {
  firebase = admin
}

exports.getFirebase = () => {
  return firebase;
};

exports.setFirebase = (fb) => {
  firebase = fb;
};

тест:

// package.test.js
process.env.NODE_ENV = "test"
beforeEach(() => {
    // Set the emulator firebase before each test
    setFirebase(firebase)
});

импорт:

// package.test.js and package.js (at the top)
const { setFirebase } = require("../db.js")

код :

// package.js 
        let wordRef = await getDb()
            .collection(DOC_HAS_WORD_COUNT)
            .doc(word)
        await wordRef.set({ word: word, 'count': 0 })
        await wordRef.update('count', getFirebase().firestore.FieldValue.increment(1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...