node.js - Nodejs crashes when database connection fails -


while database server not available , function of node-express rest service hiexpress called, nodejs crashes node server , console of node reports

sql server connection closed

i not want happen because either should go err function or @ least must cautht catch block. what avoid crash of nodejs when database server not available using following code absolutely fine long database server available.

var sqlserver = require('seriate');  app.get('/hiexpress',function(req, res) {     var sr = {error:'',message:''};     var sql= 'select * table1 id=? , name=?';     var params = {id: 5, name:'sami'};         exedb(res,sr,sql, params);//sent 4 parameters (not 6) });  function exedb(res, sr, sql, params, callback, multiple) {     try {         var obj = {};         (p in params) {             if (params.hasownproperty(p)) {                 obj[p] = {                     type: sqlserver.varchar,                     val: params[p]                 };             }         };          var exeoptions = {             query: sql,             params: obj         };         if (multiple) {              exeoptions.multiple = true;         }          sqlserver.execute(sqlserverconfigobject, exeoptions).then(function (results) {             sr.data = results;             if (callback)                 callback(sr);             else                 res.json(sr); //produces result when success         }, function (err) {             //sr.message = sql;             console.log(11);             sr.error = err.message;             res.json(sr);         });     }         catch (ex) {             console.log(21);         sr.error = ex.message;         res.json(sr);     } } 

why preferred use seriate

i had not been comfortable node-sql, when when came multiple queries option not using transaction. facilitates easy go parameterized queries.

you can use transaction without seriate async below

async.series([     function(callback) {db.run('begin transaction', callback)},     function(callback) {db.run( ..., callback)},     function(callback) {db.run( ..., callback)},     function(callback) {db.run( ..., callback)},     function(callback) {db.run('commit transaction', callback)},  ], function(err, results){     if (err) {         db.run('rollback transaction');         return console.log(err);     }      // if queries return rows results[query-no] contains them }) 

the code dirty. pass req , res params db-layer not idea.

try change exedb. i'm not sure, don't set error catcher promise

function exedb(res, sr, sql, params, callback, multiple) {     // execute no error, no doubt     var obj = {};     (p in params) {         if (params.hasownproperty(p)) {             obj[p] = {                 type: sqlserver.varchar,                 val: params[p]             };         }     };      var exeoptions = {         query: sql,         params: obj     };      if (multiple) {          exeoptions.multiple = true;     }      // potential problem here.      // catch useless because code below asynchronous.     sqlserver.execute(sqlserverconfigobject, exeoptions).then(function (results) {         sr.data = results;         if (callback)             callback(sr);         else             res.json(sr); //produces result when success     }).error(function(err){ // !!! must provide on-error         console.log(err);     }; } 

Comments