【发布时间】: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