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

时间:2017-09-07 17:13:29

标签: sql-server node.js typescript nodemon

我有一个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%完成   下一个......

2 个答案:

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

来自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 });
  };
}     
相关问题