You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express中间件能否访问错误处理中间件?JWT验证错误处理咨询

问题描述

我目前正在使用Express框架,希望优雅处理JsonWebToken错误。我编写了两个中间件函数:一个用于从JWT令牌中提取用户信息的userExtractor,另一个用于针对特定场景处理路由错误的errorHandler。

userExtractor代码如下:

const userExtractor = async (req, res, next) => {
    const token = req.token
    if (token) {
        const decodedToken = jwt.verify(token, process.env.SECRET)
        const user = await User.findById(decodedToken.id)
        req.user = user
    }

    next()
}

当请求包含有效令牌并通过验证,且能在数据库中找到令牌内ID对应的用户时,用户对象会被附加到请求上。

我尝试处理用户发送无效令牌的情况,该错误由jsonwebtoken的.verify方法抛出:

Desktop\backend\node_modules\jsonwebtoken\verify.js:75
    return done(new JsonWebTokenError('invalid token'))

我的错误处理中间件本应捕获该特定错误,但不确定中间件的运行机制是否允许实现这一点:

const errorHandler = (error, req, res, next) => {
    if (error.name === "JsonWebTokenError") {
        return res.status(400).json({error: 'invalid token has been sent'})
    }
    next(error)
}

我已正确初始化两个中间件,且错误处理中间件被设置为最后一个挂载的中间件:

// Util middleware
app.use(middleware.tokenExtractor)
app.use(middleware.userExtractor)

// Routes
app.use('/auth', authRouter);
app.use('/api/me', meRouter)

app.get("/", (req, res) => {
    res.send("Hello World!");
});

app.use(middleware.errorHandler)

请问中间件能否访问错误处理中间件来处理该JWT验证错误?


解决方案

可以实现,但你的userExtractor中间件需要调整错误处理逻辑,具体修改如下:

  1. 用try/catch捕获同步与异步错误
    jwt.verify是同步方法,抛出的错误无法自动被Express错误处理中间件捕获,必须手动包裹try/catch,并将错误传递给next();同时await User.findById的异步错误也能被try/catch捕获:
const userExtractor = async (req, res, next) => {
    const token = req.token
    if (token) {
        try {
            const decodedToken = jwt.verify(token, process.env.SECRET)
            const user = await User.findById(decodedToken.id)
            req.user = user
        } catch (error) {
            // 将错误传递给后续的错误处理中间件
            return next(error)
        }
    }
    next()
}
  1. 确认错误处理中间件的挂载顺序
    你当前的挂载顺序是正确的——错误处理中间件必须放在所有路由和业务中间件之后,这样所有未被处理的错误都会流经它。

修改完成后,当用户发送无效令牌时,jwt.verify抛出的JsonWebTokenError会被try/catch捕获,通过next(error)传递给errorHandler,此时错误处理中间件会识别error.name === "JsonWebTokenError",返回预设的400状态码和错误信息。


内容的提问来源于stack exchange,提问作者user19686218

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 22:45:11