Firebase 云函数 - 返回未定义

标签 firebase firebase-cloud-messaging google-cloud-functions

这是我用来从数据库中获取 senderName 和 messageText 的代码。在我的日志中,我收到一条错误消息“函数返回未定义,预期的 promise 或值”。我正在使用此功能向消息接收者发送通知。通知正在正确发送。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);


exports.sendPushNotification = functions.database.ref('/messages/{messageId}').onWrite(event => {


var db = admin.database();

var messageText;
var senderName;
var receiverId;
var senderId;

var messageId = event.params.messageId;


var messageTextRef = db.ref('/messages/' + messageId + '/text');
var senderIdRef = db.ref('/messages/' + messageId + '/fromId');
var receiverIdRef = db.ref('/messages/' + messageId + '/toId');

messageTextRef.once("value", function(data) {

        messageText = data.val();

senderIdRef.once("value", function(data) {

        senderId = data.val();


receiverIdRef.once("value", function(data) {

        receiverId = data.val();


 var senderNameRef = db.ref('/users/' + senderId + '/name');

senderNameRef.once("value", function(data) {

        senderName = data.val();

        console.log(senderName);
        console.log(messageText);



const payload = {

    notification : {
        title: String(senderName),
        body: String(messageText),
        badge: "1",
        sound: 'default',
    }

};

     return admin.database().ref('fcmToken').once('value').then(allToken => {
        if (allToken.val()) {
            const token = Object.keys(allToken.val());
        return admin.messaging().sendToTopic(receiverId, payload).then(response => {

            });

         };



        }, function (errorObject) {
    console.log("The read failed: " + errorObject.code);
    });


 }, function (errorObject) {
    console.log("The read failed: " + errorObject.code);
    });    


     }, function (errorObject) {
    console.log("The read failed: " + errorObject.code);
    });



 }, function (errorObject) {
    console.log("The read failed: " + errorObject.code);
    });


});                                                                               
});

最佳答案

你那里有一个怪物功能。如果您在获取所有数据库值时返回最外层的 Promise ,应该可以解决问题,并确保在所有计算完成之前您的函数不会停止。在你的情况下,这是在线〜25:

...

return messageTextRef.once("value", function(data) {

...

关于Firebase 云函数 - 返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46777546/

相关文章:

javascript - 等到 firebase 完成加载数据(vue)/'await' 不工作

ios - <FIRInstanceID/WARNING> 无法生成 key 对

android - 如何修复 Xamarin.Android 中的 "[FirebaseMessaging] Unable to log event: analytics library is missing"

android - 您如何替换以前使用 Cloud Functions 发送的通知?你如何防止收到某些通知?

javascript - 如何从 Firebase 数据库集合中准备键和值

javascript - 无法从 Firebase 仅获取当前用户名

java - 如何修复 Unboxing 可能会在 firebase 中产生 nullPointer Exception?

firebase - 无法通过点击通知导航到特定页面。 Flutter 深度链接问题

ios - 如何使用 Swift 删除 Firebase 上超过 30 分钟的数据?

javascript - Firebase 云函数超时