为什么 Express 错误处理中间件可能收不到 req.session?

Why might Express error handling middleware not receive req.session?

环境: node.js,Express,express-session 包。

背景:我正在测试一个 Express 错误处理程序,我得到了一个我没有预料到的错误。

以下简化路线会引发错误。

TypeError: Cannot read property 'userValues' of undefined

exports.errorHandler = wrapAsync(async function(error, req, res, next) {

    let loggedIn = req.session.userValues ? true : false;

    res.render('error', { loggedIn });
});

然而,当我删除 error 参数时,它可以正常工作,正如我预期的那样。

exports.errorHandler = wrapAsync(async function(req, res, next) {

    let loggedIn = req.session.userValues ? true : false;

    res.render('error', { loggedIn });
});

为什么会这样?

第二个示例中的基本模式适用于几十个不包含错误参数的路由。

你可以使用这样的东西。它只会在出现 ERROR 500 时执行,除非你使用 next() 函数将 ERROR 404 传递给这个,如果你正确处理了所有错误,你应该能够做出 ERROR 500 这应该可以 catchERROR.

const errorHandler = require("./your-file");

...
... every other route even error 404 handler
...

app.use(errorHandler);

ERROR 404

使用next()是什么意思

如果你用过express-generator那么你应该已经有了这个code:

// catch 404 and forward to error handle
app.use((req, res, next) => {
    next('not found');
});

如果您使用这种方法,最终文件现在应该看起来像这样:

...
... all previous routes
...

// catch 404 and forward to error handle
app.use((req, res, next) => {
    next('not found');
});

// handle all other error
app.use(errorHandler);

希望对您有所帮助