gpt4 book ai didi

javascript - 循环中的 NodeJS MySQL 查询在预期之前返回

转载 作者:行者123 更新时间:2023-11-30 21:37:07 25 4
gpt4 key购买 nike

我正在尝试创建一个函数来生成 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 的新手,所以我不知道这样做是否是不好的做法。任何帮助将不胜感激!

最佳答案

在你的代码中,query的回调函数会在数据准备好后运行,所以hasDupe一开始会是false时间和生成的代码将被返回。

您可以使用Promiseasync 函数来解决您的问题

const FIND_EXISITNG_COURT =
"SELECT access_code,team1,team2 FROM courts WHERE access_code= ?";

function selectByCode(code) {
return new Promise((resolve, reject) => {
connection.query(FIND_EXISITNG_COURT, [code], (err, results) => {
if (err) {
reject(err);
} else {
resolve(results.length)
}
});
}

async function generateAccessCode() {

var random = Math.floor(Math.random() * (+30 - +0)) + +0;
var code = random.toString(16);

var hasDupe = false;

let count =0;
try{
do {

count = await selectByCode(code);
if (count > 0) {
random = Math.floor(Math.random() * (+30 - +0)) + +0;
code = random.toString(16);

hasDupe = true;
} else {
hasDupe = false;
}


} while (hasDupe);

return code;
}
catch(e){
throw e;

}
}

关于javascript - 循环中的 NodeJS MySQL 查询在预期之前返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53386621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com