NodeJS MSSQL REST连接关闭错误

时间:2018-09-21 15:45:28

标签: node.js sql-server express cluster-computing

我用NodeJS构建一个rest api。 它正在使用模块集群,express,body-parser,mssql。 解决方案工作正常,但有时结果是sql错误:服务器关闭了连接。

有人知道解决方案吗?我阅读了有关promise模块的mssql promise的信息,但是我如何实现它,这是一个好的解决方案。

当数据库服务器出现错误时:服务器关闭了我要自动重试的连接(打开SQL DB连接并执行查询)。

var cluster = require('cluster');


if (cluster.isMaster) {


var cpuCount = require('os').cpus().length;


for (var i = 0; i < cpuCount; i += 1) {
    cluster.fork();
}


cluster.on('exit', function (worker) {

    // Replace the dead worker, we're not sentimental
    console.log('Worker %d died:', worker.id);
    cluster.fork();

});


} else {


var express = require("express");
var bodyParser = require("body-parser");
var sql = require("mssql");
var app = express(); 


app.use(bodyParser.json()); 


app.use(function (req, res, next) {
    //Enabling CORS 
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, contentType,Content-Type, Accept, Authorization");
    next();
});


 var server = app.listen(process.env.PORT || 8000, function () {
    var port = server.address().port;
    console.log("App now running on port", port);
 });


var dbConfig = {
    user:  "<USER>",
    password: "<PASSWORD>",
    server: "<SERVER>",
    database: "<DB>",
    connectionTimeout: 999999999,
    requestTimeout: 999999999,
    pool: {
            max: 20,
            min: 10,
            idleTimeoutMillis: 30000
        },
    options: {
            encrypt: true
        }
};


var  executeQuery = function(res, query){     

     sql.connect(dbConfig, function (err, connection) {
         if (err) {   
                     console.log("Error while connecting database :- " + err);
                     res.send(err);
                     res.end();
                  }
                  else {

                         var request = new sql.Request(connection);

                         request.query(query, function (err, rs) {
                           if (err) {
                                      console.log("Error while querying database :- " + err);
                                      res.send(err);
                                      res.end();
                                     }
                                     else {
                                            console.log("Result :- " + rs); 
                                            res.send(rs);
                                            res.end();
                                            }
                               });
                         sql.close();      
                       }
      }); 


}


 app.post("/ic/events/add", function(req , res){
                var query = "INSERT INTO EVENT VALUES ('FILE')";
                executeQuery (res, query);
});


 app.post("/ic/process/to", function(req , res){
                var query = "SELECT TOP 1 FROM EVENT WHERE STATUS = 0";
                executeQuery (res, query);
});

}

亲切的问候,

标记

2 个答案:

答案 0 :(得分:0)

感谢您的帮助。我使用以下代码更改了应用程序以使用1个连接。运行该应用2天后,我不再有任何连接关闭错误。

//Initiallising connection string
var dbConfig = {
    user:  "",
    password: "",
    server: "",
    database: "",
    connectionTimeout: 999999999,
    requestTimeout: 999999999,
    options: {
            encrypt: true
        }
};



sql.connect(dbConfig, function (err, connection) {
         if (err) {   
                     console.log("Error while connecting database :- " + err);
                  }
            }); 


var  executeQuery = function(res, query, connection){     

                         // create Request object
                         var request = new sql.Request(connection);
                         // query to the database
                         request.query(query, function (err, rs) {
                           if (err) {
                                      console.log("Error while querying database :- " + err);
                                      res.send(err);
                                      res.end();
                                     }
                                     else {
                                            console.log("Result :- " + rs); 
                                            res.send(rs);
                                            res.end();
                                            }
                               });


      }; 

答案 1 :(得分:-1)

不要为每个执行的查询打开连接。服务器启动时打开与数据库的连接,并在应用程序的生命周期内使用该连接。

Here's an article关于在整个应用程序中共享数据库连接。

现在,如果在查询时随时断开连接,则将错误记录到日志记录系统(Loggly,Rollbar)中,让应用程序死亡,然后让节点监视器重新启动应用程序(Forever,Nodemon)。根据问题所在,发送到日志的错误可能会给您一些答案。很可能是网络错误,无法访问您的数据库。