#javascript #node.js #firebase #google-cloud-firestore #google-cloud-functions
#javascript #node.js #firebase #google-cloud-firestore #google-cloud-функции
Вопрос:
У меня есть коллекция «Пользователи», которая содержит список документов, каждый документ имеет пользовательский объект и вложенную коллекцию «Уведомления». всякий раз, когда пользователь получает новое уведомление, новый документ создается в уведомлениях его вложенной коллекции.
Триггер в облачной функции не запускается.
Вот моя структура Firestore:
И вот моя функция:
let functions = require('firebase-functions');
let admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.sendNotification = functions.firestore.collection('Users/{userID}/Notifications/{notificationId}')//
.onWrite(async (change,context) => {
// get receiver ID
const receiverId = context.params.userID;
// get notification object
const notificationObject = change.after.val();
// get sender ID
const senderUid = notificationObject.senderId;
console.log('sending notification to: ' senderUid);
if (senderUid === receiverId) {
// this should never be called
console.log('sender is the receiver.');
}
// receiver's token
const getTokenPromise = await admin.firestore().collection('Users').doc(receiverId).once('value');
const token = getTokenPromise.val().deviceToken;
// sender user object
const sender = await admin.firestore().collection('Users').doc(senderUid).once('value');
const payload = {
data: {
senderName: sender.val().userName,
senderPhoto: sender.val().userPhoto,
object: JSON.stringify(notificationObject)
}
};
try {
const response = await admin.messaging().sendToDevice(token, payload);
console.log("Successfully sent notification:", response);
}
catch (error) {
console.log("Error sending notification:", error);
}
});
Что я делаю не так?
Комментарии:
1. Как вы проверяете, что он не запускается? Из журнала облачных функций? Я вижу одну потенциальную проблему (непроверенную): вы больше не можете передавать
functions.config().firebase
данные при инициализации. См. firebase.google.com/docs/functions /…2. Спасибо за ваш ответ, Рено, я изменил инициализацию, но все еще не запущен. Я проверяю журналы и устанавливаю точку останова на стороне клиента (android) в методе onMessageReceived.
Ответ №1:
Вы должны объявить свою функцию с
exports.sendNotification = functions.firestore.document('Users/{userID}/Notifications/{notificationId}')//
.onWrite(async (change,context) => {...});
и не с
exports.sendNotification = functions.firestore.collection('Users/{userID}/Notifications/{notificationId}')//
.onWrite(async (change,context) => {...});
На самом деле облачные функции для Firestore запускаются на уровне документа. Более подробная информация здесь и здесь в документе.