与节点js的安全异步代码失败

时间:2013-11-27 16:38:58

标签: node.js express

如何使我的节点js应用程序失败安全。 我编写了db查询包装器,一些提供者(例如,用户和我的控制器(路由))

数据库连接功能:

exports.connect = function(callback) {
    sqlClient.connect(function(err, conInfo){
        if (err) callback(err);
        conInfo = 'Connection at ' + sqlClient.host + ':' + sqlClient.port + '/'
            + sqlClient.database + ' used by ' + sqlClient.user;
        callback(null, conInfo);
        //runDDL();
    });
};

查询功能:

exports.runQuery = function(query_str, columns, params, callback) {
    var sqlQuery = query_str + " " + columns;
    var query = sqlClient.query(sqlQuery, params, function(err) {
        if (err) throw err;
        console.log('NEW QUERY____________________');
        console.log(sqlQuery);
        console.log(params);
        if (err) throw err;
        query.on('row', function(row, result) {
            result.addRow(row);
        });
        query.on('end', function (result) {
            callback(null, result.rows);
        });
    });
};

提供商功能:

User.prototype.get = function(id, callback) {
db.runQuery('SELECT * FROM users', 'WHERE id=$1', [id],
    function(err, allUsers){
        if (err) throw err;
        callback(null, allUsers[0]);
});

};

控制器中的用法:

exports.getById = function(req, res) {
    var id = req.params.user_id;
    userProvider.get(id, function(err, user){
        if (err) throw err;
        res.send(user);
    });
};

在任何意外情况下,我的服务器都会打印错误并且进程将会死亡。如何更轻松地处理某些类型的错误,例如让我们考虑req.params.user_id将超过数据库中的记录数。

如您所见,我只是在使用throw err时抛出错误。是否有更多的失败安全和有效的做法来处理错误,并打印到客户可理解的信息,保持服务器的工作?

1 个答案:

答案 0 :(得分:2)

您可以使用express编写自己的错误处理程序: 请参考以下示例:

https://github.com/visionmedia/express/blob/master/examples/error/index.js