如何修复函数循环时"Function returned undefined, expected Promise or value"错误



我开发了一个android应用程序,允许用户注册。我写了一个firebase云函数,当创建用户时会触发它,为刚注册的用户生成一个5位数的随机整数值,它将生成的代码以以下结构存储在firebase实时数据库中。

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

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

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或值错误。过了一段时间,我再次尝试,它生成的代码很好。其他人测试了它,结果也出现了同样的错误。

如何解决此问题以确保它始终有效?提前谢谢。

我真的不清楚这个函数应该做什么,顶层while循环对我来说也没有意义。然而,我可以看到这个代码的操作有一些错误。

首先,它过于依赖于全局状态checker。对于所有函数调用,这个值不会是一致的,因为它们不会都在同一个服务器实例上运行。每个正在运行的服务器实例将看到不同的checker值。有关云函数如何运行代码的更多信息,请观看本系列视频。

其次,当函数启动时checker的值为1时,函数将完全按照错误消息所说的操作——它将返回undefined。通过阅读代码应该很容易看出这是如何发生的。

为了解决这个问题,我建议首先明确描述这个函数在调用时应该做什么。此外,我强烈建议消除对全局变量的依赖,除非你绝对确定你了解自己在做什么以及它们的影响。

我不久前也遇到了同样的问题。ESLint不允许函数完成,因为它会评估代码的每一部分是否都返回promise。从我所看到的,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;
}

最新更新