当数据库连接失败时,Nodejs崩溃

时间:2016-08-01 15:28:10

标签: node.js exception-handling node-seriate

虽然我的数据库服务器不可用,并且调用了hiExpress之类的节点快速休息服务的任何功能,但Nodejs会崩溃节点服务器和节点报告控制台

  

sql server connection closed

我不希望这种情况发生,因为它应该转向错误的功能,或者至少它必须是catch块的cautht。 如果数据库服务器不可用,我该怎么做才能避免nodejs的崩溃我使用以下代码,只要数据库服务器可用就可以了

var sqlServer = require('seriate');

app.get('/hiExpress',function(req, res)
{
    var sr = {error:'',message:''};
    var sql= 'select * from table1 where id=? and name=?';
    var params = {id: 5, name:'sami'};    
    exeDB(res,sr,sql, params);//sent only 4 parameters (not 6)
});

function exeDB(res, sr, sql, params, callback, multiple) {
    try {
        var obj = {};
        for (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);
    }
}

为什么我更喜欢使用连续

我对node-SQL并不太满意,特别是当它出现时 多个查询选项甚至不使用事务。它便于访问参数化查询。

1 个答案:

答案 0 :(得分:0)

您可以使用不seriate的交易,但使用下面的async

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 some queries return rows then results[query-no] contains them
})

代码非常脏。将reqres参数传递给db-layer不是一个好主意。

尝试更改exeDB。我不确定,但可能你没有设置错误捕手承诺

function exeDB(res, sr, sql, params, callback, multiple) {
    // It will execute with no error, no doubt
    var obj = {};
    for (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 is here. 
    // Catch is useless because code below is 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){ // !!! You must provide on-error
        console.log(err);
    };
}