Admin.firestore не является функцией при попытке использования облачных функций Google с помощью node.js

Это заголовок файла node.js index.js:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var db = admin.firestore();

Это функция node.js для прослушивания изменений firestore:

exports.myFoo = functions.firestore
  .document('foo/{bar}')
  .onWrite(event => {
    // do stuff
}

Это файл package.json:

  "dependencies": {
    "firebase-admin": "^5-.4.2",
    "firebase-functions": "^0.7.1",
    "firestore": "^1.1.6"
  },

Когда я пытаюсь выполнить команду "firebase deploy", это ошибка, которую я получаю:

Ошибка: при разборе триггеров функции произошла ошибка.
TypeError: admin.firestore не является функцией

askFirebase

Ответ 1

Я смог воспроизвести ошибку и грубую силу решения. Я не знаю много о npm и не могу дать полное объяснение, почему это решение сработало.

В моем оригинале package.json содержится:

  "dependencies": {
    ...
    "firebase-admin": "^4.2.1",
    "firebase-functions": "^0.7.1",
    ...
  },

Как рекомендованный в документации, я запустил эти две команды в папке функций:

npm install -g firebase-tools
npm install [email protected] --save

Я также пробовал:

npm install --save firebase-admin
npm upgrade

Я неоднократно получал эти сообщения об ошибках:

+-- UNMET PEER DEPENDENCY [email protected]
npm WARN [email protected] requires a peer of [email protected]~5.4.2 but none was installed.

Я решил, что firebase-admin нужно обновить, но не смог. Поэтому я отредактировал файл зависимостей, чтобы удалить эту строку:

"firebase-admin": "^4.2.1"

затем снова запустил npm install --save firebase-admin. При этом package.json содержала версию "firebase-admin": "^5.4.2" и var db = admin.firestore(); скомпилирована без ошибок.

Ответ 2

functions.firestore должен быть functions.firestore()

Ответ 3

Попробуй это

const getReceiverDataPromise = admin.firestore().doc('users/' + receiverUID).get();
const getSenderDataPromise = admin.firestore().doc('users/' + senderUID).get();

return Promise.all([getReceiverDataPromise, getSenderDataPromise]).then(results => {

        const receiver = results[0].data();
        console.log("receiver: ", receiver);

        const sender = results[1].data();
        console.log("sender: ", sender);

    });

Ответ 4

Чтобы решить в файле file.js(метод async):

const getFirestore = () => admin.firestore()

Пример:

 getFirestore()
  .collection(`mailchimp-users`)
  .doc(uid)
    .set(profile)
      .then(() => res.redirect(MAILCHIMP_AUTH_SUCCESS_URL))
      .catch((error) => res.json({error}))