函数返回未定义,预期Promise或值和通知长时间延迟

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数返回未定义,预期Promise或值和通知长时间延迟相关的知识,希望对你有一定的参考价值。

我在执行代码时得到firebase返回undefined,期望的promise或value,此外还需要花很长时间才能发送通知

'use-strict'
const functions = require('firebase-functions');

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

exports.channelNotification = functions.database.ref('/ChannelMessages/{channelid}/{messageid}').onCreate(event => {
    const channelid1 = event.params.channelid;
    admin.database().ref('/Channels/' + channelid1 + '/Users').on("child_added", function (snapshot, childkey) {
         admin.database().ref('/Channels/' + channelid1 + '/Users/' + childkey + '/deviceToken').once('value',function(token){
            admin.database().ref('/Channels/' + channelid1 + '/name').once('value',function(name){
                admin.database().ref('/Channels/' + channelid1 + '/profilePic').once('value',function(pp){
                    const payload = {
                        data: {
                            "title" : name,
                            "body"  : event.data.val().content,
                            "icon"  : pp,
                            "id"  : channelid1,
                            "type"  : "channel"
                        }
                    };  
                    return admin.messaging().sendToDevice(token, payload).then(response => {
                        console.log('nice feature');
                    });
                });
            });
         });
    });
});
答案

您需要从完成所有异步工作时解析的函数返回一个promise。现在,您将返回未定义的值。

除此之外,您不应该在云函数中使用on()进行查询。您应该只使用once()一次获取一个值。您的第一个查询是使用on(),但其他人使用的是once()

最后,如果使用once()返回的promises链接查询而不是使用回调深度嵌套,则函数将更易于读写。

以上是关于函数返回未定义,预期Promise或值和通知长时间延迟的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 云函数 - 返回未定义、预期的 Promise 或值

Firebase 云函数错误:函数返回未定义、预期的 Promise 或值

函数以状态完成:'ok',但控制台日志显示函数返回未定义、预期的 Promise 或值

Cloud Functions 错误:函数返回未定义、预期的 Promise 或值,以及 TypeError:无法读取未定义的属性“First_Name”

身份验证错误后的 Firebase 用户数据

长时间未打开应用,收不到 GCM 推送通知