NestJS中间件next()传参及错误校验最佳实践咨询
问题解答与最佳实践
验证通过(OK)的场景下,完全不需要先做error instanceof Error校验再调用next()。因为当JWT验证成功时,verifyToken是解析后的合法payload对象,根本不可能是Error实例,直接调用next()传递控制权即可。
你的当前代码里用.catch((error) => { return error; })再判断是否为Error实例的写法过于冗余,其实可以利用try/catch直接捕获verifyAsync抛出的验证错误,让逻辑更清晰。
最佳实践示例代码
import { Request, Response, NextFunction } from 'express'; import { NestMiddleware, HttpException, HttpStatus } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; export class AuthMiddleware implements NestMiddleware { constructor(private readonly jwtServ: JwtService) {} async use(req: Request, res: Response, next: NextFunction) { try { const authorization = req.headers['authorization']; if (!authorization) { throw new HttpException('Token is missing', HttpStatus.UNAUTHORIZED); } // 拆分Bearer token,取第二部分 const token = authorization.split(' ')[1]; // 验证失败时会直接抛出错误,自动进入catch块 const decodedToken = await this.jwtServ.verifyAsync(token); // 验证通过:可以把解析后的payload挂载到req上,供后续路由使用 req.user = decodedToken; console.log("-OK--", decodedToken); // 直接调用无参next(),传递控制权给下一个中间件/路由 next(); } catch (err) { // 所有验证失败场景统一处理:把错误传给next(),交给全局异常过滤器处理 next(err); } } }
关键优化点说明
- 去掉手动捕获
verifyAsync错误的逻辑,让验证失败时自然抛出错误,由外层try/catch统一处理,代码更简洁易读 - 验证通过时直接调用无参
next()即可,无需额外判断是否为Error类型 - 解析后的JWT payload可以挂载到
req对象上(比如req.user),方便后续路由处理函数直接获取用户信息 - 所有错误场景(缺失token、token无效/过期)都通过
throw抛出,统一在catch块中调用next(err),交给Nest的全局异常过滤器处理标准化的错误响应
内容的提问来源于stack exchange,提问作者andi
相关产品推荐
相关产品推荐

