Я развернул функцию для Firebase, чтобы уведомлять каждое пользовательское устройство, когда в базе данных Firebase Realtime создается предупреждение для этого пользователя. Я извлек код из разных примеров, потому что я не эксперт в node.js. Проблема в том, что функция не получает никаких уведомлений об облачных сообщениях, и я нигде не могу прочитать ни одного оператора console.log (), поэтому в основном у меня нет отзывов о том, что с ним не так.
Я пыталсяустановка эмулятора облачных функций Google безрезультатно. Возможно, я сделал что-то не так, но предоставленный URL не нашел базу данных. После нескольких изменений кода он даже выдавал ошибку, говоря, что проект не существует. Затем я попытался в https://console.cloud.google.com/functions/details/us-central1/sendAlertsNotification?project=my-project&authuser=0&pli=1&tab=testing&duration=PT1H,, где мой проект должен быть заменен моим реальным именем проекта, чтобы протестировать функцию, но я по-прежнему не получаю никакой обратной связи, кроме как: - отправлено sendAlertsNotification - нет жетонов уведомлений для отправки в,- Выполнение функции заняло 1515 мс, и завершилось со статусом: 'ok'
Но без генерации и отправки какого-либо уведомления.
Код, который не работает и не показывает никаких операторов console.log, таков:
exports.sendAlertsNotification = functions.database.ref('/alerts')
.onCreate(async (snapshot, context) => {
console.log('sendAlertsNotification started');
const userId = snapshot.val.userId;
console.log(userId);
const getDeviceTokensPromise = admin.database().ref('/users/{userId}/fcmTokens').once('value');
const results = await Promise.all([getDeviceTokensPromise]);
const id = snapshot.val.id;
console.log(id);
const subject = snapshot.val.subject;
console.log(subject);
const payload = {
notification: {
id: id,
subject: subject
}
};
const tokensSnapshot = results[0];
if (!tokensSnapshot.exists()) {
return console.log('There are no notification tokens to send to.');
}
else if (!tokensSnapshot.hasChildren()) {
return console.log('There are no notification tokens to send to.');
}
const tokens = Object.keys(tokensSnapshot.val());
const response = await admin.messaging().sendToDevice(tokens, payload);
const tokensToRemove = [];
response.results.forEach((result, index) => {
const error = result.error;
if (error) {
console.error('Failure sending notification to', tokens[index], error);
if (error.code === 'messaging/invalid-registration-token' ||
error.code === 'messaging/registration-token-not-registered') {
tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove());
}
}
});
return Promise.all(tokensToRemove);
});
Кто-нибудь представляет, что происходит не так?
Отредактировано: я нашел себе одну причину, по которой он не отправлял уведомления: полезная нагрузка уведомления должна включать как минимум следующие параметры:название, тело. Затем я могу включить столько пользовательских данных, сколько необходимо.
Но проблема остается: если я использую только фиктивные данные, уведомление отправляется, но если я пытаюсь проверить вставку нового узла в «/ alerts»в https://console.cloud.google.com/functions/details на вкладке «Тестирование» он никогда не получает данные снимка.
В поле «Инициирующее событие» я ввожу что-то вроде этого:
{
"OriginAlert" : "0",
"Subject" : "Test alert 1",
"Discarded" : "0",
"Details" : "Custom details of the alert",
"RecDate" : "2019-10-21T00:00:00",
"Id" : "1",
"hasBeenRead" : false,
"userId" : "0UserId9"
}
И журналыброшенные всегда отражают, что DataSnapshot является нулем. Если вместо этого я использую обработчик события .onWrite, результат тот же, он отражает, что change.after имеет значение null.
Так что, возможно, я использую неправильное содержимое для поля события Triggering, учитывая, что я тестируюфоновая функция, а не http.
¿Может кто-нибудь сказать мне, что происходит не так?