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
相关产品推荐
相关产品推荐

