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中间件需要调整错误处理逻辑,具体修改如下:
- 用
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() }
- 确认错误处理中间件的挂载顺序
你当前的挂载顺序是正确的——错误处理中间件必须放在所有路由和业务中间件之后,这样所有未被处理的错误都会流经它。
修改完成后,当用户发送无效令牌时,jwt.verify抛出的JsonWebTokenError会被try/catch捕获,通过next(error)传递给errorHandler,此时错误处理中间件会识别error.name === "JsonWebTokenError",返回预设的400状态码和错误信息。
内容的提问来源于stack exchange,提问作者user19686218
相关产品推荐
相关产品推荐

