TMDOG的微服务之路_04——Nest.js 的异常筛选器

博客地址:TMDOG的博客

在上一篇博客中,我们实现了一个简易的用户管理 API 并添加了中间件功能。本篇博客,我们将探讨如何在 Nest.js 中使用异常筛选器。可以帮助我们更好地处理异常。

异常筛选器

1. 创建异常筛选器

异常筛选器用于捕获和处理应用程序中的HTTP异常。在 src\common\filter 下创建一个异常筛选器 http-exception.filter.ts

import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';
import { Request, Response } from 'express';

@Catch(HttpException)
export class HttpExceptionFilter implements ExceptionFilter {
  catch(exception: HttpException, host: ArgumentsHost) {
    const ctx = host.switchToHttp();
    const response = ctx.getResponse<Response>();
    const request = ctx.getRequest<Request>();
    const status = exception.getStatus();
    const exceptionResponse = exception.getResponse();
    
    const errorResponse = {
      statusCode: status,
      timestamp: new Date().toLocaleString(),
      path: request.originalUrl,
      message: exceptionResponse['message'] || exception.message,
    };

    response.status(status).json(errorResponse);
  }
}

解释

2. 全局挂载异常筛选器

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { HttpExceptionFilter } from './common/filter/http-exception.filter';
require('dotenv').config();

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalFilters(new HttpExceptionFilter());

  await app.listen(3000);
}
bootstrap();

3. 修改controller

@Post('register')
  register(@Req() req: Request, @Res() res: Response) {
    const { username, password } = req.body;
    try {
      const result = this.userService.register(username, password);
      res.status(HttpStatus.CREATED).send({ result, massage: '注册成功' });
    } catch (e) {
      throw new HttpException(e.message, HttpStatus.UNAUTHORIZED);
    }
  }

4.运行效果

正常请求:
image
然后我们再次注册:
image

我们发现响应了异常

然后我们注释掉挂载的异常筛选器,再次同样的操作
image
我们发现只响应了HttpException的内容

结论

通过以上步骤,我们成功地在 Nest.js 应用中添加并使用了异常筛选器。在处理异常时起到了统一对外响应不同的异常的作用。希望这篇博客能帮助你更好地理解和使用 Nest.js 中的这些高级功能。

在下一个博客中,我们将进一步探讨 Nest.js 的其他功能,敬请期待。

如果各位技术大佬有任何问题或建议,欢迎在评论区留言。

感谢阅读!