我有一个NodeJS应用程序,它是我的服务器,我创建了一个Database类来帮助我处理查询我的SQL DB。如果我每隔一段时间发送一次请求,一切运行正常..没有问题..但如果我开始向我的服务器发送垃圾邮件请求它因Error: Cannot enqueue Quit after invoking quit.
而崩溃
这是我的数据库类
中的查询函数static query(query: string): Promise<any> {
console.log('Query: ' + query);
return new Promise((resolve, reject) => {
this.connect().then(success => {
sqlConn.query(query, (err, results) => {
if (err) { return reject(err);
} else {
return resolve(results);
}
});
}).catch(err => {
return reject(err);
}).then( () => {
if (sqlConn.state !== 'disconnected') {
sqlConn.end();
}
});
});
};
这是this.connect()
函数
static connect(): Promise<any> {
return new Promise((resolve, reject) => {
sqlConn = mysql.createConnection(this.connectionData);
sqlConn.connect(err => {
if (err) { return reject(err); } else {
return resolve('SQL connection established');
}
});
});
};
我很确定有时会出现这个问题,它仍然存在 处理一个查询,然后另一个查询在第一个查询之前 一个完成,所以它会两次调用
sqlConn.end()
,即使它是 已断开连接?非常感谢任何帮助...&GT;主要目标是让查询在运行之前等待100%完成 下一个......
答案 0 :(得分:1)
如果您真的想使用此方法,请使用 async 库的 eachSeries 功能。
var chunkedArray= [];
async.eachSeries(chunkedArray, startUpload, endUpload);
funtion startUpload(data,cb){
//iterate over every single item in array 1 at a time
}
function endUplaod(err){
//finally call this
}
这可能会有所帮助: - https://caolan.github.io/async/docs.html#eachSeries
但我建议您使用连接池,这样可以减少数据库的开销,并且可以更有效地使用mysql,然后建立多个连接。
// Load module
var mysql = require('mysql');
// Initialize pool
var pool = mysql.createPool({
connectionLimit : 10,
host : '127.0.0.1',
user : 'root',
password : 'root',
database : 'db_name',
debug : false
});
module.exports = pool;
答案 1 :(得分:1)
您可以使用npm模块mysql
来简化代码,并使用它的内置连接池。
var mysql = require('mysql');
var pool = mysql.createPool({
connectionLimit : 10,
host : 'example.org',
user : 'bob',
password : 'secret',
database : 'my_db'
});
pool.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
当然,你可以创建自己的功能,宣传这样的呼叫:
function query (sql) {
return new Promise((resolve, reject) => {
pool.query(sql, (error, results, fields) =>
error ? reject(error) : resolve({ results, fields });
};
}