Я использую эмуляторы Firebase. До 4 часов go все работало нормально. Но теперь мои эмулированные облачные функции вызывают следующую ошибку:
> Error with Backup TypeError: Channel credentials must be a ChannelCredentials object
> at new ChannelImplementation (/Users/pitouli/Documents/GIT/my-app/functions/node_modules/google-gax/node_modules/@grpc/grpc-js/build/src/channel.js:67:13)
> at new Client (/Users/pitouli/Documents/GIT/my-app/functions/node_modules/google-gax/node_modules/@grpc/grpc-js/build/src/client.js:57:36)
> at new ServiceClientImpl (/Users/pitouli/Documents/GIT/my-app/functions/node_modules/google-gax/node_modules/@grpc/grpc-js/build/src/make-client.js:49:5)
> at GrpcClient.createStub (/Users/pitouli/Documents/GIT/my-app/functions/node_modules/google-gax/build/src/grpc.js:220:22)
Я четко определил проблему: она появляется каждый раз, когда я делаю запрос Firestore.
Например, это вычитание всей функции:
return new Promise((resolve, reject) => {
db.doc(`users/${userId}`).update({ dbUpdated: new Date() })
.then(() => {
resolve();
})
.catch(e => reject(e));
});
Если я заменю его на:
return Promise.resolve();
У меня больше нет ошибки. Но, очевидно, у меня больше нет ожидаемого поведения ...
Я сделал большой рефакторинг (я установил eslint в стиле airbnb, поэтому мне пришлось изменить довольно много файлов), поэтому я, вероятно, сделал что-то не так . Но после нескольких часов исследования я не нашел, что могло бы оправдать эту ошибку: (
Я даю вам ниже соответствующий фрагмент моего кода. Мой реальный код намного длиннее, но я тестировал только этот фрагмент : он воспроизводит ошибку (и если я заменю функцию «markUserUpdated», как показано ранее, она исчезнет.)
И последнее, но не менее важное: я подтверждаю, что эмулятор Firestore работает нормально: приложение работает хорошо с данными из эмулятора.
Спасибо за вашу помощь!
index.js
:
const functions = require('firebase-functions');
const { db } = require('./admin');
const DEBUG = true;
function markUserUpdated(userId) {
return new Promise((resolve, reject) => {
db.doc(`users/${userId}`).update({ dbUpdated: new Date() })
.then(() => {
if (DEBUG) console.log('User successfully marked Updated', userId);
resolve();
})
.catch(e => reject(e));
});
}
exports.writeContact = functions.firestore
.document('users/{userId}/contacts/{contactId}')
.onWrite((doc, context) => {
const { userId } = context.params;
return markUserUpdated(userId);
});
admin.js
:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const serviceAccount = require('../serviceAccountKey.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: 'https://my-app.firebaseio.com',
storageBucket: 'my-app.appspot.com',
});
const db = admin.firestore();
const { FieldValue } = admin.firestore;
const { Timestamp } = admin.firestore;
const storage = admin.storage();
module.exports = {
db, storage, FieldValue, Timestamp, functions,
};
Редактировать : код обрабатывается Babel (не знаю, может ли это повлиять)