NodeJS Закрытое соединение MSSQL REST Connection - PullRequest
0 голосов
/ 21 сентября 2018

Я строю остальные API с NodeJS.Он использует модули cluster, express, body-parser, mssql.Решение работает нормально, но иногда результатом является ошибка sql: сервер закрыл соединение.

Кто-нибудь знает решение.Я читал об обещании mssql модуля обещания, но как мне это реализовать, и является ли это хорошим решением.

Когда сервер базы данных выдает ошибку: Сервер закрыл соединение, я хочу автоматическую повторную попытку (Открыть соединение с БД SQL и выполнить запрос).

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

}

С уважением,

Mark

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Я буду благодарен за вашу помощь.Я изменил приложение со следующим кодом, чтобы использовать 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();
                                            }
                               });


      }; 
0 голосов
/ 21 сентября 2018

Не открывать соединение для каждого выполненного запроса.Откройте соединение с базой данных при запуске сервера и используйте это соединение на весь срок службы приложения.

Вот статья о совместном использовании соединения с базой данных в приложении.

Теперь, если при запросе происходит отключение в любое время, зарегистрируйте ошибку в системе ведения журнала (Loggly, Rollbar), дайте приложению умереть и затем монитор узла перезапустит приложение (Forever, Nodemon).Ошибка, отправленная в журнал, может дать вам несколько ответов относительно проблемы.Скорее всего, это ошибка сети, и ваша база данных недоступна.

...