【发布时间】:2016-04-13 11:37:51
【问题描述】:
以下代码位于 express 4.0 路由器中。我故意给出了错误的 SELECT 语句(表不存在)。 clientErrorHandler() 按预期调用,然后节点退出(崩溃)。 由于数据库调用的异步性质,添加 try/catch 没有帮助。 当我纠正 SELECT 语句时,一切都按预期工作。
router.use(function (req, res, next){
DBCon.DBConUtil.pool.getConnection(function(err, connection){
if (err) throw new DBDataError("Error while getting connection from pool");
connection.query('SELECT * FROM employee' ,function(err,rows){
if(err){
connection.release();
throw new DBDataError("Error while executing select statement using pool connection.");
}else{
res.rows1 = rows;
logger.info("App-Instance-name: %s, filename: %s, MessageContent: %s", process.env.NODE_APP_INSTANCE, __filename, JSON.stringify({message: "Data received from Db using connection pool: ", data: rows}));
connection.release();
}
});
});
res.send(JSON.stringify(res.rows1));
//next();
});
router.use(clientErrorHandler);
router.use(errorHandler);
function clientErrorHandler(err, req, res, next) {
logger.info("App-Instance-name: %s, filename: %s, Cookies: %s", process.env.NODE_APP_INSTANCE, __filename, JSON.stringify(req.cookies));
logger.info("App-Instance-name: %s, filename: %s, stack trace: ", process.env.NODE_APP_INSTANCE, __filename, err.stack);
return next(err);
}
function errorHandler(err, req, res, next) {
res.status(500);
res.send('Error in handing DB calls.');
}
function DBDataError(message) {
this.constructor.prototype.__proto__ = Error.prototype
Error.captureStackTrace(this, this.constructor)
this.name = this.constructor.name
this.message = message
}
两个附加信息:-
(1)如果在“if(err)”之外没有实际的 DB 错误时抛出相同的 DBDataError,则按预期调用 clientErrorHandler() 并且节点不会退出。这表明脚本能够按预期抛出和捕获错误。
(2)如果使用“if(err)”捕获 DB 错误并且我没有抛出新的 DBDataError,则不会调用 clientErrorHandler(),这也是预期的行为并且节点不会退出。这表明节点没有因为 DB 异常而崩溃。
任何专家都可以对此有所了解。
谢谢。
【问题讨论】: