这是我的代码
mysql = require('mysql');
con = mysql.createConnection(connectionSetttings);
app.get('/users/list', ensureLogin, function (req, res, next) {
con.query(query.getUserList, [req.user.innId], function (err, rows) {
if (err) {
next(err); // also tried: return next(err)
} else {
displayUsers();
}
});
}, function (err) {
console.error(err);
displayErrorPage(500);
});
我在没有运行MySQL服务器的情况下运行它以查看Express是否会呈现错误页面。问题是,Express只是将堆栈限制在浏览器中。我的代码有什么问题吗?如何正确链接中间件?
答案 0 :(得分:2)
以与其他中间件函数相同的方式定义错误处理中间件函数,除了错误处理函数有四个参数而不是三个:(err,req,res,next)。
确保将错误处理添加到应用after
路由。
var app = require('express')();
app.get('/users/list', ensureLogin, function (req, res, next) {
con.query(query.getUserList, [req.user.innId], function (err, rows) {
if (err) {
next(err);
} else {
displayUsers();
}
});
});
// Error handling middleware
app.use(function (err, req, res, next) {
displayErrorPage(500);
});
答案 1 :(得分:0)
当使用MySQL作为会话存储时,使用app.use()
附加的与会话相关的中间件将拦截所有路由和故障的请求。这会使看似无关的路线抛出HTTP500
,即使它们看起来不像return next(err)
。
解决方法是仅将任何与会话相关的中间件附加到必要的路由。或者,您可以将它们包装在像这样的过滤器函数中:
var middlewareFilter = function(middleware) {
// Return whatever function that is returned by this function
// to be used in app.use()
return function (req, res, next) {
// Set the routes to be ignored.
var exceptionList = [
'images',
'stylesheets',
'scripts'
];
// Cast req.url to string so it can use JS's string methods
var path = String(req.url);
// If path matches any of the exceptionList...
if (array.contains(path.split('/')[1], exceptionList)) {
// ...just do nothing
return next();
} else {
// Otherwise, return the middleware
return middleware(req, res, next);
}
}
}
并像app.use(session(sessionConfig));