函数循环时如何解决“函数返回的未定义,期望的承诺或值”错误

时间:2019-11-13 14:08:45

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

我有一个自己开发的Android应用程序,该应用程序可以注册用户。我编写了一个firebase云函数,该函数在创建用户时触发,为刚刚注册的用户生成5位数的随机整数值,并将生成的代码存储在以下结构的firebase实时数据库中。

MainProject
     |
     |-Codes
         |-UniqueUID_1
                |-code:72834
         |-UniqueUID_2
                |-code:23784

为确保代码生成在后端,我部署了该函数,如下所示。有一个值“ checker ”初始化为0。我使用此值确定何时退出while循环。基本上,我希望函数生成一个5位数的随机值,然后检查实时数据库是否在“代码”下的所有条目中都存在该生成的值,然后如果不存在,则将其附加到相关UID下的代码中。如果存在, checker 保持为零,并且循环继续。

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

var checker = 0;
exports.createUserCode = functions.auth.user().onCreate(event => {

    while (checker == 0){
        var newRand = getUserCode(89999,10000);
        var userObject = {
            uCode : newRand
        };
        //run a db query to strategically check value generated
        return admin.database().ref("Codes/").orderByChild("uCode").equalTo(newRand).once("value",snapshot => {
            if (!snapshot.exists()){
                checker = 1;
                //add uCode into respective uid slot under Codes
                console.log(""+newRand+" : "+event.uid);
                return admin.database().ref('Codes/' + event.uid).set(userObject);

            }else{
                checker = 0;
                console.log("uCode "+newRand+" exists");
                console.log("uCode generation failed for: "+event.uid);
            }
        });
    }
});

function getUserCode(size, add){
    return Math.floor(Math.random()*size+add);
}

我对其进行了测试,并且效果很好。我以为问题解决了。但是,在第7到第11次试验中,它给了我函数返回未定义的,预期的Promise或值错误。一段时间后,我再次尝试了一下,它生成的代码很好。其他人对其进行了测试,并带来了相同的错误。

如何解决此问题以确保其始终有效?预先感谢。

2 个答案:

答案 0 :(得分:0)

我真的不清楚这个函数应该做什么,并且顶层的while循环对我来说没有意义。但是,我可以看到这段代码在做什么。

首先,它过于依赖全局状态checker。对于所有函数调用,此值都将不一致,因为它们都不会在同一服务器实例上运行。每个正在运行的服务器实例将看到不同的值checker。请watch this video series了解有关Cloud Functions如何运行代码的更多信息。

第二,当函数启动时checker的值为1时,该函数将完全按照错误消息的指示进行操作-返回未定义。通过阅读代码,很容易看到这种情况。

要解决此问题,我建议首先给出一个清晰的描述,说明该函数在调用时的作用。另外,我强烈建议消除对全局变量的依赖,除非您完全确定自己了解自己在做什么以及它们的作用。

答案 1 :(得分:0)

前段时间我遇到了同样的问题。 ESLint不允许函数完成,因为它会评估代码的每个部分是否都返回了承诺。 从我可以看到if的第一部分确实返回了一些东西。尝试在else块中返回一个布尔值。

if (!snapshot.exists()){
                checker = 1;
                //add uCode into respective uid slot under Codes
                console.log(""+newRand+" : "+event.uid);
                return admin.database().ref('Codes/' + event.uid).set(userObject);

            }else{
                checker = 0;
                console.log("uCode "+newRand+" exists");
                console.log("uCode generation failed for: "+event.uid);
return false;
            }