我有一个自己开发的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或值错误。一段时间后,我再次尝试了一下,它生成的代码很好。其他人对其进行了测试,并带来了相同的错误。
如何解决此问题以确保其始终有效?预先感谢。
答案 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;
}