Firebase云函数错误:函数返回的值未定义,预期的承诺或价值

时间:2018-06-24 10:57:58

标签: javascript firebase firebase-realtime-database firebase-cloud-messaging google-cloud-functions

我定义了一个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 :(得分:1)

由后台事件触发的Firebase Cloud功能必须返回一个诺言(或在某些情况下为一个值,例如return false;)。

由于admin.messaging().send()返回了一个承诺(请参阅doc),因此您只需要返回此承诺,如下所示:

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();,这也会返回一个承诺。因此,您应该将这些承诺链接到您的Cloud Function中。应该大概进行如下操作,但是如果没有完整的代码,很难保证这是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函数(因此不带有后台事件),而第二个则集中于后台事件触发的函数,但建议先观察第一个,然后再观察第二个一个。

答案 1 :(得分:1)

您将返回以返回sendNotificationMessage返回的承诺。这就是Cloud Functions如何知道何时完成所有异步工作的方式:

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

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