如何在Node.js中对MySQL查询进行while循环?

How to do a while loop for a MySQL query in Node.js?

提问人:Mewshinyex 提问时间:7/2/2022 更新时间:7/9/2022 访问量:218

问:

我目前正在尝试使用Typescript和Express将php代码转换为Node.js。

在脚本中,我在查询数据库之前生成一个随机的 6 位代码以验证该代码不存在,否则我会生成一个新代码。

这是原始的PHP代码:

    $code = generate_random_int(); // Generate a random code

    $existing_codes = exec_sql($db,"SELECT code FROM codes WHERE code = $code;"); // Check if the generated code already exists in the database

    while(!empty($existing_codes)){ // While there is (at least) 1 occurence in the DB for the generated code

        $code = generate_random_int(); // Generate a new random code

        $existing_codes = exec_sql($db,"SELECT code FROM codes WHERE code = $code;"); // Update the check for the newly generated code.

        // If an occurence is found, the while loop will be reiterated. Otherwise, the while loop will end with the last generated code.
    }

但是,Node.js MySQL 库只允许回调,因为该函数是异步的,这阻止了我上面说明的行为。

我在互联网上到处看,还没有找到任何在 Node.js 中重现这种行为的方法,所以这就是我在这里写这篇文章的原因:)

我考虑过在其中使用 db.query 调用的 for 循环,但没有成功,与 while 语法和更新的布尔值相同。 这是我最新的(不成功的)尝试:


        let code = generateRandomInt()

        // query is a simplified function for db.query() from MySQL
        query(`SELECT code FROM codes WHERE code = ${code};`, result => {
            if (result === []) {
                res.send(String(code))
                return
            } else {
                code = generateRandomInt()
                // While loop creating a new SQL statement for the new code and regenerating it until the response is []
            }
        })

        res.send(String(code))

非常感谢您的帮助:)

PS :我是 Express 的新手,我不习惯在 StackOverflow 上发帖,所以请不要犹豫,告诉我我是否做错了什么,或者您是否需要任何补充信息

MySQL 节点.js while循环

评论

0赞 Barmar 7/2/2022
使用 的 Promise 版本。然后,您可以在循环中使用。node-mysqlawait
0赞 danblack 7/2/2022
如果您只想选择一个条目,则无需循环即可执行此操作。SELECT code FROM codes where code >= ?

答:

0赞 Edwin Torres 7/9/2022 #1

这是另一种方法。一旦你有了一组现有的代码,就使用循环来查找一个未使用的代码:

...
const go = async () => {
  const existingCodes = await getExistingCodes();  // your function that returns a list 
                                                   // of existing codes; return a Promise
  // find an unused code
  let code = generateRandomInt();
  while (existingCodes.indexOf(code) !== -1) {
    code = generateRandomInt();
  }

  // use your new code
  console.log(`new code is: ${code}`);
};
go();