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 并使用它的内置连接池来简化您的代码。

来自the documentation

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 });
  };
}