-1

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

sql server 连接关闭

我不希望这种情况发生,因为它应该进入 err 函数,或者至少它必须被 catch 块所关注。当数据库服务器不可用时,我能做些什么来避免 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 不太满意,尤其是当涉及到多个查询选项时,甚至不使用事务。它有助于轻松进行参数化查询。

4

1 回答 1

0

seriate您可以在没有但有异步的情况下使用事务,如下所示

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

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

尝试更改 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);
    };
}
于 2016-08-01T15:48:58.643 回答