Node.js SQL服务器在收到多个请求时崩溃

我有一个NodeJS应用程序,这是我的服务器,我创build了一个数据库类来帮助我处理查询我的SQL数据库。 如果我发送请求彼此之间的一秒钟,一切运行良好..没有问题..但是,如果我开始发送垃圾邮件请求到我的服务器它崩溃,由于Error: Cannot enqueue Quit after invoking quit.

这是我的数据库类中的查询function

 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()两次,即使它已经断开连接? 任何帮助是极大的赞赏…

>主要目标是查询在运行下一个之前等待100%完成。

如果你真的想使用这种方法,那么请使用asynchronous库的eachSeriesfunction。

 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

但我宁愿build议你使用连接池,使你的数据库开销较less,你可以更有效地使用你的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); }); 

当然,您可以创build自己的函数,这样可以调用这样的函数:

 function query (sql) { return new Promise((resolve, reject) => { pool.query(sql, (error, results, fields) => error ? reject(error) : resolve({ results, fields }); }; }