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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 08:55:27