Mysql while循环中的节点JS回调

Mysql while循环中的节点JS回调,mysql,node.js,asynchronous,Mysql,Node.js,Asynchronous,我有一个MySQL数据库,表为id,它使用nanoid模块存储到目前为止生成的所有唯一id。我已经实现了以下代码来生成表中没有的唯一id //sql library const mysql = require('mysql'); const sql_obj = require(__dirname + '/../secret/mysql.json'); //nanoid library const { customAlphabet } = require('nanoid'); const al

我有一个MySQL数据库,表为id,它使用nanoid模块存储到目前为止生成的所有唯一id。我已经实现了以下代码来生成表中没有的唯一id

//sql library
const mysql = require('mysql');
const sql_obj = require(__dirname + '/../secret/mysql.json');


//nanoid library
const { customAlphabet } = require('nanoid');
const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
const nanoid = customAlphabet(alphabet, 30);

function uniqueid(){
    let found = 0;
    let conn = mysql.createConnection(sql_obj);
    while (found === 0){
        let id = nanoid();
        conn.connect(function(err){
            if (err){
                found = 2;
            }
            else{
                conn.query("SELECT * FROM id WHERE value = " + mysql.escape(id),function(err,result,fields){
                    if (err){
                        found = 2;
                    }
                    else{
                        if (result.length === 0){
                            found = 1;
                        }
                    }
                })
            }
        })
    }
    if (found === 2){
        return {error: 1,ret: null};
    }
    else if (found === 1){
        return {error: 0,ret: id};
    }
}

console.log(uniqueid());
我知道,我的实现是错误的。由于回调本质上是异步的,while循环永远不会结束,因此我得到了内存不足的错误JavaScript堆<我在网上浏览了很多文章来整理这一点,但是没有。主要问题是函数uniqueid应该返回一些值,因为我是从其他JavaScript文件调用它的

感谢您的帮助

我认为防止这种情况的最好方法是使用
async/await

我保证你的mySql连接。您可以将
查询
发送到函数

    //sql library
    const mysql = require('mysql');
    const sql_obj = require(__dirname + '/../secret/mysql.json');


    //nanoid library
    const { customAlphabet } = require('nanoid');
    const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    const nanoid = customAlphabet(alphabet, 30);

    let db = (query, values = null) => {  
        return new Promise((resolve, reject) => {
            let conn = mysql.createConnection(sql_obj);
            conn.connect(function (err) {
                if (err) {
                    reject(err);
                }
                else {
                    conn.query(query + values, function (err, result, fields) {
                        if (err) {
                            reject(err);
                            return;
                        }
                        else {
                            if (result.length === 0) {
                                resolve();
                            }
                        }
                    })
                }
            })
        })
    }

    async function uniqueid() {
        while (found === 0) {
            let id = nanoid();
            try {
                await db("SELECT * FROM id WHERE value =", mysql.escape(id));
                return { error: 0, ret: id };

            } catch (error) {
                return { error: 1, ret: null };
            }
        }
    }

    console.log(uniqueid());