【问题标题】:Node JS callbacks in a while loop循环中的节点 JS 回调
【发布时间】:2021-07-30 15:15:53
【问题描述】:

我有一个带有 id 表的 MySQL 数据库,它使用 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 heap out of memory
我浏览了网络上的许多文章来解决这个问题,但无法解决。主要问题是函数 uniqueid 应该返回一些值,因为我是从其他 JavaScript 文件调用它。
感谢您的帮助

【问题讨论】:

    标签: mysql node.js asynchronous


    【解决方案1】:

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

    我答应了你的 mySql 连接。您可以将您的queryvalues 发送给该函数。

        //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());
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-06
      • 2018-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多