2016-04-12 2 views
0

Я использую модуль узла mssql в моем проекте, все хорошо до тех пор, пока я не сделаю асинхронный вызов.Ошибка подключения в модуле узла mssql

При множественном вызове асинхронного вызова его запуск дает мне ошибку подключения «Соединение закрыто». может кто-то заглянуть в код и помочь мне.

==== SqlServerDAL.js некоторые вещи, как этот

var sql = require('mssql'); 
var _sqlConfig = require("../../../../config/dbconfig.json"); 

function SqlServerDAL() { 
    this._sqlConfig = _sqlConfig; 
    this._sqlConnection = null; 
} 

/** 
* @param : request > request or query parmanter to excute sql query 
* @param : callback > after execution neect to send response back to serr 
* @param : sqlReqConf > to build the requst object from the configuration 
*/ 
SqlServerDAL.prototype.executeRequest = function (request, callback) { 

    var self = this; 

    self._sqlConnection = new sql.Connection(this._sqlConfig); 

    this._sqlConnection.connect().then(function() { 

     var _sqlRequest = new sql.Request(self._sqlConnection); 

     try { 
      _sqlRequest.input('someVar','someValue') 

      _sqlRequest.execute('myStoreProc').then(function (recordsets) { 
       callback(null, recordsets); 
      }).catch(function (sqlEx) { 
       callback({ 
        code: "ERR0003", 
        message: sqlEx.message, 
        type: sqlEx.name 
       }, null); 
      }); 
     } catch (sqlEx) { 
      callback({ 
       code: "ERR0004", 
       message: sqlEx.message, 
       type: sqlEx.name 
      }, null); 
     } 

    }).catch(function (sqlEx) { 
     callback({ 
      code: "ERR0001", 
      message: sqlEx.message, 
      type: sqlEx.name 
     }, null); 
    }); 
}; 

module.exports = new SqlServerDAL(); 

это выше файла Я звоню из dal.js

/* JSLint VARS: истинные, PlusPlus: правда, разви: правда, номен: правда, отступы: 4, MaxErr: 50 */ /* глобальный требуют, модуль, регистратор */

var Q = require("q"); 
    var sqlServerDAL = require('./sqlDAL/sqlServerDAL'); 

    /** 
    * 
    * @constructor: 
    */ 

    function DAL() {} 

    /** 
    * @param : customRequst : this json object will come from respective dbschema files, 
    *      This object bening used to build sqlRequest object 
    */ 

    DAL.prototype.executeRequest = function (customRequest) { 

     var deferred = Q.defer(); 

     sqlServerDAL.executeRequest(customRequst, function (sqlEx, recordsets) { 

      if (recordsets) { 
       logger.info("_sqlRequest is successfully executed:" + JSON.stringify(recordsets)); 
       deferred.resolve(recordsets); 
      } else if (sqlEx) { 
       deferred.reject({ 
        code: sqlEx.code, 
        message: sqlEx.message, 
        type: sqlEx.name 
       }); 
      } 
     }); 

     return deferred.promise; 
    }; 


    module.exports = new DAL(); 

// мой контроллер, как

app.use("mycontroller", function(req, res, next){ 
var dal = new Dal(); 
dal.executRequest(function(result){ 
    res.send(result) 
} , function(err){ 
    console.log("got some error" + errr) 
}) 
    }) 
+0

У меня была такая же проблема с конфигурацией json. Пробовал устаревшую строку соединения, которая сработала. Попробуйте: 'mssql: // $ {cfg.db.user}: $ {cfg.db.password} @ $ {cfg.db.server}/SQLEXPRESS/$ {cfg.db.database}' –

+0

извините! Невезение –

ответ

0

Да, я получил ответ. Из-за асинхронного вызова новый запрос (self.connection) получает старый объект, который закрыт старым вызовом функции. Таким образом, нам нужно создать новый запрос, подобный этому.

this._sqlConnection.connect().then(function (connection) { 
    var _sqlRequest = new sql.Request(connection); 
})