Firebase облако функция всегда тайм-аут

Я изучаю облачные функции firebase, и я пытаюсь отправить уведомления с помощью http-запроса.

Проблема в том, что даже если мне удастся отправить уведомление, запрос всегда будет тайм-аутом.

Здесь мой script

/functions/index.js
const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

exports.friendRequestNotification = functions.https.onRequest((req, res) => {

    const senderId = req.query.senderId;
    const recipientId = req.query.recipientId;
    const getRecipientPromise = admin.database().ref(`/players/${recipientId}`).once('value');
    const getSenderPromise = admin.database().ref(`/players/${senderId}`).once('value');

    return Promise.all([getRecipientPromise, getSenderPromise]).then(results => {

        const recipient = results[0];
        const sender = results[1];

        const recipientToken = recipient.child("notificationsInfo/fcmToken").val();
        const notificationAuthorization = recipient.child("notificationsInfo/wantsToReceiveNotifications").val();
        const recipientBadge = recipient.child("notificationsInfo/badgeNumber").val();
        const senderUsername = sender.child("username").val();

        const payload = {
            notification: {
              title: `FriendRequest`,
              body: `You have a new friend request from ${senderUsername}!`,
              badge: (recipientBadge+1).toString()
            }
        };

        if (notificationAuthorization) {

            return admin.messaging().sendToDevice(recipientToken, payload).then(response => {

            });

        }

        return admin.database().ref(`/players/${recipientId}/notificationsInfo/badgeNumber`).setValue(recipientBadge+1);

    });

});

Плюс Похоже, что значок badgeNumber никогда не обновляется, это связано с проблемой тайм-аута?

Ответ 1

Облачные функции с HTTP-запуском работают так же, как и Express-приложения - у вас есть объект ответа (res), который нужно использовать для отправки чего-либо, когда запрос выполнен. В этом случае, похоже, вы могли бы сделать что-то вроде:

return Promise.all([
  /* ... */
]).then(() => {
  res.status(200).send('ok');
}).catch(err => {
  console.log(err.stack);
  res.status(500).send('error');
});

Ответ 2

@Michael Bleigh отлично подходит для ответа на этот вопрос, позвольте мне добавить еще кое-что для будущих пользователей.

В соответствии с документацией пожарной базы: -

Используйте эти рекомендуемые подходы для управления жизненным циклом вашего Функции:

  • Разрешить функции, которые выполняют асинхронную обработку (также известную как "фоновые функции"), возвращая обещание JavaScript.

  • Terminate HTTP functions with res.redirect(), res.send(), or res.end(). (The case in this question.)

  • Завершите синхронную функцию оператором return;.

Примечание Важно управлять жизненным циклом функции, чтобы обеспечить ее правильное разрешение. Правильно завершая функции, вы можете избежать чрезмерных расходов от функций, которые работают слишком долго или работают бесконечно. Кроме того, вы можете убедиться, что экземпляр Cloud Functions, выполняющий вашу функцию, не завершит работу, пока ваша функция не достигнет своего завершающего состояния или состояния.

  • Вам нужен платный план (Blaze, платите, как хотите) для доступа к внешним API.

Вы можете увидеть предупреждение ниже в журнале функций Firebase, если платежная учетная запись не настроена.

Платежный аккаунт не настроен. Внешняя сеть недоступна и Квоты строго ограничены. Настройте платежную учетную запись, чтобы удалить эти ограничения

Проверьте эту ссылку для получения дополнительной информации.