Node.js SQL 服务器在接收多个请求时崩溃
Node.js SQL server crashes when receiving multiple requests
我有一个 NodeJS 应用程序作为我的服务器,我创建了一个数据库 class 来帮助我处理查询我的 SQL 数据库。如果我在彼此之间发送请求一秒钟,一切运行正常..没问题..但是如果我开始向我的服务器发送垃圾邮件请求,它会因 Error: Cannot enqueue Quit after invoking quit.
而崩溃
这是我的数据库中的查询函数 class
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');
}
});
});
};
I'm pretty sure the problem appears sometimes, it would still be
processing one query, and then another query comes before the first
one finishes, so it would call sqlConn.end()
twice, even when it's
already disconnected? Any help is greatly appreciated...
> Main goal is for the query to wait till it's 100% done before it runs
the next one..
如果你真的想使用这种方法,请使用 eachSeries async 库的函数。
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;
您可以使用 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 });
};
}
我有一个 NodeJS 应用程序作为我的服务器,我创建了一个数据库 class 来帮助我处理查询我的 SQL 数据库。如果我在彼此之间发送请求一秒钟,一切运行正常..没问题..但是如果我开始向我的服务器发送垃圾邮件请求,它会因 Error: Cannot enqueue Quit after invoking quit.
这是我的数据库中的查询函数 class
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');
}
});
});
};
I'm pretty sure the problem appears sometimes, it would still be processing one query, and then another query comes before the first one finishes, so it would call
sqlConn.end()
twice, even when it's already disconnected? Any help is greatly appreciated...> Main goal is for the query to wait till it's 100% done before it runs the next one..
如果你真的想使用这种方法,请使用 eachSeries async 库的函数。
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;
您可以使用 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 });
};
}