在NestJS中组织和抛出业务逻辑异常,通常会遵循以下步骤:
1. 定义自定义异常类
利用NestJS提供的HttpException
类,你可以创建自定义异常类以表示特定的业务逻辑问题。例如,如果你在用户服务中需要抛出一个当用户未找到时的异常,你可以定义一个UserNotFoundException
:
typescriptimport { HttpException, HttpStatus } from '@nestjs/common'; export class UserNotFoundException extends HttpException { constructor() { super('User not found', HttpStatus.NOT_FOUND); } }
2. 在服务中抛出自定义异常
在你的服务(service)中,当检测到某个特定的业务逻辑错误时,你可以抛出自定义的异常。例如,在一个用户的服务中,当你尝试获取一个不存在的用户时,可以抛出刚刚定义的UserNotFoundException
:
typescript@Injectable() export class UsersService { constructor(@InjectRepository(User) private readonly userRepository: Repository<User>) {} async findOne(id: string): Promise<User> { const user = await this.userRepository.findOne(id); if (!user) { throw new UserNotFoundException(); } return user; } }
3. 异常过滤器
NestJS支持异常过滤器(exception filters),它们可以捕获整个应用程序的异常。你可以定义一个全局异常过滤器或特定于控制器或路由的异常过滤器。
typescriptimport { ExceptionFilter, Catch, ArgumentsHost, HttpStatus } from '@nestjs/common'; import { HttpException } from '@nestjs/common'; @Catch(HttpException) export class HttpExceptionFilter implements ExceptionFilter { catch(exception: HttpException, host: ArgumentsHost) { const ctx = host.switchToHttp(); const response = ctx.getResponse(); const request = ctx.getRequest(); const status = exception.getStatus(); const exceptionResponse = exception.getResponse(); response .status(status) .json({ statusCode: status, timestamp: new Date().toISOString(), path: request.url, message: exceptionResponse['message'] || exceptionResponse, }); } }
然后,你可以在你的模块中注册异常过滤器:
typescript@Module({ // ...其他配置 providers: [ { provide: APP_FILTER, useClass: HttpExceptionFilter, }, ], }) export class AppModule {}
4. 响应给客户端
一旦抛出异常并由异常过滤器处理,客户端将接收到一个结构化的响应,其中包含了异常的相关信息,如HTTP状态码、错误消息等。
示例:
假设客户端尝试获取一个不存在的用户。
请求:
httpGET /users/123
响应:
json{ "statusCode": 404, "timestamp": "2023-03-10T10:00:00.000Z", "path": "/users/123", "message": "User not found" }
以上步骤确保了NestJS中业务逻辑异常的清晰组织和一致的处理方式,同时也为客户端提供了有用的错误处理信息。
2024年6月29日 12:07 回复