Ошибка облачной функции Firebase: функция возвратила неопределенное, ожидаемое обещание или значение - PullRequest
0 голосов
/ 24 июня 2018

Я определил облачную функцию Firebase, которая выполняется при триггере onCreate базы данных в реальном времени.Функция отлично выполняет заданный алгоритм, за исключением того, что в журналах всегда отображается ошибка: Function returned undefined, expected Promise or value.Я уже столько всего перепробовал, но до сих пор не могу устранить эту ошибку.Важные фрагменты кода приведены ниже.

Я уже правильно вернул обещание.Любые идеи, как сделать ошибку уйти?

index.js

const sendNotificationMessageModule = require('./sendNotificationMessage');

exports.sendNotificationMessage = functions.database.ref( '/Notifications/{pushId}').onCreate((snapshot, context) => {
  sendNotificationMessageModule.sendNotificationMessage(snapshot, context, db, admin);
});

sendNotificationMessage.js

Первые части кода:

exports.sendNotificationMessage = function(snapshot, context, db, admin) {
.
.
.

Последние части кода:

        if(...) {
        .
        .
        .
          var androidNode = {};
          androidNode[constants.propertyNotificationString] = notificationNode;
          message[constants.propertyAndroidString] = androidNode;

          return admin.messaging().send(message)
          .then((response) => {
            console.log('Successfully sent message:', response);
            return snapshotNotificationMessage.ref.remove();
          })
          .catch((error) => {
            console.log('Error sending message:', error);
          });
        }

Как видите, сообщение было успешно отправлено, но ошибка все еще присутствует.И, конечно же, данные в базе данных реального времени также были успешно удалены.

cloud function error

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Вы вернетесь, чтобы вернуть обещание, возвращенное sendNotificationMessage.Вот как Облачные Функции знают, когда вся асинхронная работа выполнена:

const sendNotificationMessageModule = require('./sendNotificationMessage');

exports.sendNotificationMessage = functions.database.ref( '/Notifications/{pushId}').onCreate((snapshot, context) => {
  return sendNotificationMessageModule.sendNotificationMessage(snapshot, context, db, admin);
});
0 голосов
/ 24 июня 2018

Облачные функции для Firebase, запускаемые событиями в фоновом режиме , должны возвращать обещание (или в некоторых случаях значение, например, return false;).

Поскольку admin.messaging().send() возвращает обещание (см. документ ), вам просто нужно вернуть это обещание следующим образом:

var androidNode = {};
androidNode[constants.propertyNotificationString] = notificationNode;
message[constants.propertyAndroidString] = androidNode;
....
return admin.messaging().send(message);
})
.catch((error) => {
    console.log('Error sending message:', error);
    return false;
});

Однако вы также звоните snapshotNotificationMessage.ref.remove();, что также возвращает обещание. Поэтому вы должны связать эти обещания в своей облачной функции. Это , вероятно должно быть сделано следующим образом, но без вашего полного кода трудно гарантировать, что это на 100% правильно. Если вы добавите к своему вопросу весь свой код, мы можем адаптировать его.

....
    var androidNode = {};
    androidNode[constants.propertyNotificationString] = notificationNode;
    message[constants.propertyAndroidString] = androidNode;
    return snapshotNotificationMessage.ref.remove();
.then(() => {
    return admin.messaging().send(message);
})
.catch((error) => {
    console.log('Error sending message:', error);
    return false;
});

Кроме того, я предлагаю вам посмотреть эти два видео от команды Firebase, которые объясняют, почему и как вернуть обещание:

https://www.youtube.com/watch?v=7IkUgCLr5oA

https://www.youtube.com/watch?v=652XeeKNHSk

Первый - больше о функциях HTTP, которые запускаются через HTTP-запрос (т.е. не с фоновым событием), а второй - о функциях, запускаемых фоновым событием, но рекомендуется просматривать первую перед просмотром второго один.

...