Express.js next(错)不工作

时间:2017-02-06 15:06:25

标签: node.js express error-handling

这是我的代码

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只是将堆栈限制在浏览器中。我的代码有什么问题吗?如何正确链接中间件?

2 个答案:

答案 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));

一样使用它们