我试图创建一个函数,将生成4个唯一的id(十六进制)插入到我的数据库。我将查询放入do while循环中以检查冲突,如果代码已经存在,则重新生成代码,如果没有,则返回值。
问题是循环在预期的时间之前退出。例如,如果代码“a”已生成,但已在数据库中显示,则代码将重新生成,但循环将退出,并且不会进行新的查询。不会返回新代码-而是返回生成的第一个代码。
这是我的密码:
const FIND_EXISITNG_COURT =
"SELECT access_code,team1,team2 FROM courts WHERE access_code= ?";
function generateAccessCode() {
var random = Math.floor(Math.random() * (+30 - +0)) + +0;
var code = random.toString(16);
var hasDupe = false;
do {
connection.query(FIND_EXISITNG_COURT, [code], (err, results) => {
if (err) {
throw err;
} else if (results.length > 0) {
random = Math.floor(Math.random() * (+30 - +0)) + +0;
code = random.toString(16);
hasDupe = true;
} else {
hasDupe = false;
}
});
} while (hasDupe);
return code;
}
我对nodejs是个新手,所以我不知道这样做是否不好。任何帮助都将不胜感激!
2条答案
按热度按时间6ovsh4lw1#
你的电话
connection.query
是异步的,这意味着您定义的回调不会立即运行。您的代码只是注册回调,然后继续执行,直到结束generateAccessCode
. 回调直到很久以后才被调用(当db返回一些东西时),所以hasDupe
仅在原始函数退出后很长时间内设置。您基本上有3个选项来处理这个问题:回调、承诺或异步/等待(这实际上只是承诺之上的语法糖)。
使用async/await但试图尽可能接近原始结构的示例(多次运行以查看其工作情况):
改为使用回调:
e0bqpujr2#
在代码中,回调函数
query
将在数据准备就绪后运行,因此hasDupe
将false
在第一时间和生成的代码将被返回。你可以用
Promise
以及async
函数来解决您的问题