Я просто не вижу, куда я иду не так.Мой Cloud Firestore находится на «europe-west3», функции развернуты на «europe-west1» (документы говорят мне, что это самое близкое расположение к west3).
Структура такова: у меня естькуча «билетов», каждый из которых может иметь вложенную коллекцию под названием «комментарии».Таким образом, консоль выглядит следующим образом:
Загрузка прошла успешно:
Код функции был взят из официальных примеров кода Github-репо для примеров функций
Вот как выглядит мой код:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
exports.countComments = functions.region('europe-west1').database.ref('/tickets/{ticketId}/comments/{commentsid}')
.onWrite(
async (change) => {
const ticketsRef = change.after.ref.parent;
const countRef = ticketsRef.parent.child('comments_count');
let increment;
if(change.after.exists() && !change.before.exists()) {
increment = 1;
} else if(!change.after.exists() && change.before.exists()) {
increment = -1;
} else {
return null;
}
await countRef.transaction((current) => {
return (current || 0) + increment;
});
console.log('Counter updated');
return null;
});
exports.recountComments = functions.region('europe-west1').database.ref('/tickets/{ticketId}/comments_count')
.onDelete(
async (snap) => {
const counterRef = snap.ref;
const collectionRef = counterRef.parent.child('comments');
const commentsData = await collectionRef.once('value');
return await counterRef.set(commentsData.numChildren());
}
)
Теперь,проблема в том, что эти функции просто не срабатывают.Я ничего не вижу в журналах, независимо от того, отправляю ли я изменения через своих клиентов (приложение Flutter) или я изменяю вещи прямо в консоли Firebase.
В своем отчаянии я 'Мы также пытались просто прослушать "/ tickets", так как любые изменения ниже этого пути также должны вызывать - но ничего нет.
Итак.Что является очевидным, что я упустил из виду?И да, я смотрел на другие вопросы / ответы, но ничего не прыгнуло на меня ...
edit:
Это будет исправленная версия, вероятно, не оптимальная.
exports.countComments = functions.region('europe-west1').firestore.document('/tickets/{ticketId}/comments/{commentsId}')
.onWrite(
async (change, context) => {
const ticketId = context.params.ticketId;
const ticketRef = admin.firestore().collection('tickets').doc(ticketId);
let increment;
if(change.after.exists && !change.before.exists) {
increment = 1;
} else if(!change.after.exists && change.before.exists) {
increment = -1;
} else {
return null;
}
return transaction = admin.firestore().runTransaction(t => {
return t.get(ticketRef)
.then(doc => {
let count = (doc.data().comments_count || 0) + increment;
t.update(ticketRef, {comments_count: count});
});
}).then(res => {
console.log('Counter updated');
}).catch(err => {
console.log('Transaction error:', err);
});
});