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}))