我定义了一个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);
});
}
如您所见,消息已成功发送,但错误仍然存在。 当然,实时数据库中的数据也已成功删除。
答案 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);
});