Функция Firebase не вызывает уведомления, и я нигде не вижу операторов console.log - PullRequest
0 голосов
/ 29 октября 2019

Я развернул функцию для 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.

¿Может кто-нибудь сказать мне, что происходит не так?

...