Mysql while循环中的节点JS回调
我有一个MySQL数据库,表为id,它使用nanoid模块存储到目前为止生成的所有唯一id。我已经实现了以下代码来生成表中没有的唯一idMysql 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
//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());