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

NestJS升级至v9后抛出错误时应用崩溃问题求助

问题诊断与解决方案

问题根源

NestJS v9对Fastify平台的异常处理逻辑做了调整,中间件处于请求生命周期的早期阶段,此时Nest的异常过滤器还未完全绑定到Fastify的响应流程中。直接抛出HttpException时,Fastify内部的响应对象初始化未完成,导致调用preSerialization方法时出现undefined错误,最终触发服务崩溃。

修复步骤

1. 修正OPTIONS请求的逻辑漏洞

原中间件处理OPTIONS请求时未终止后续代码执行,可能引发意外逻辑,先补上return:

@Injectable()
export class AuthMiddleware implements NestMiddleware {
  async use(req: Request, res: Response, next: NextFunction): Promise<void> {
    if (req.method === 'OPTIONS') {
      return next(); // 加上return终止后续执行
    }

    if (!req.headers.authorization) {
      // 后续修改异常处理逻辑
      throw new HttpException('No credentials set', HttpStatus.UNAUTHORIZED);
    }

    const token = req.headers.authorization;
    const claims = await authClient.verify(token);

    // ...其他业务逻辑

    next();
  }
}

2. 替换中间件中的异常抛出方式

由于中间件阶段Nest的异常处理机制尚未完全生效,改为直接通过Fastify响应对象返回错误:

if (!req.headers.authorization) {
  res.status(HttpStatus.UNAUTHORIZED).send({
    statusCode: HttpStatus.UNAUTHORIZED,
    message: 'No credentials set'
  });
  return; // 必须return,避免执行后续next()
}

3. 验证Fastify版本兼容性

确保fastify版本与@nestjs/platform-fastify@9.2.1兼容,NestJS v9要求Fastify版本为^4.0.0,检查package.json依赖后,若版本不匹配则执行更新:

npm install fastify@^4.x

额外优化建议

如果希望统一使用Nest的HttpException处理逻辑,可将中间件的鉴权逻辑迁移到**守卫(Guard)**中。守卫处于Nest请求生命周期的更靠后阶段,抛出的异常会被Nest全局异常过滤器正常捕获处理,不会触发服务崩溃。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 01:01:11