在 NestJS 中,异常处理是构建健壮、可维护的应用程序的关键部分。NestJS 提供了一些内置的异常处理机制,同时也允许你自定义异常处理逻辑。以下是 NestJS 中异常处理的详细讲解及示例。
NestJS 中的异常处理机制
内置异常类:
NestJS 提供了一些内置的异常类,这些类位于 @nestjs/common 包中。这些异常类可以直接用来处理不同类型的错误,例如:
- HttpException:基础异常类,其他 HTTP 异常类都继承自它。
- NotFoundException:用于表示资源未找到的错误。
- BadRequestException:用于表示请求无效或参数错误。
- UnauthorizedException:用于表示未经授权的访问尝试。
- ForbiddenException:用于表示禁止访问的错误。
- InternalServerErrorException:用于表示服务器内部错误。
异常过滤器:
NestJS 允许你创建自定义的异常过滤器,这些过滤器可以处理应用程序中的所有异常。异常过滤器是实现 ExceptionFilter 接口的类,使用 @Catch() 装饰器来标记。
全局异常过滤器:
你可以将异常过滤器注册为全局过滤器,使其处理整个应用程序中的所有异常。
异常处理管道:
管道可以用于在请求处理之前对输入进行验证和转换。验证管道会抛出 BadRequestException,当输入验证失败时。
示例
以下是一个关于如何在 NestJS 中进行异常处理的详细示例,包括使用内置异常类、创建自定义异常过滤器以及注册全局异常过滤器。
// cats.controller.ts
import { Controller, Get, Param, NotFoundException, BadRequestException } from '@nestjs/common';
@Controller('cats')
export class CatsController {
@Get(':id')
findOne(@Param('id') id: string) {
if (isNaN(Number(id))) {
throw new BadRequestException('Invalid ID format');
}
if (Number(id) === 0) {
throw new HttpException('Not Found', HttpStatus.NOT_FOUND);
}
const cat = this.findCatById(id); // 假设这是一个方法,用于查找猫的信息
if (!cat) {
throw new NotFoundException('Cat not found');
}
return cat;
}
private findCatById(id: string) {
// 假设这里有查找猫的逻辑
return null; // 示例中返回 null 以触发 NotFoundException
}
}
常用的 HttpException
在 NestJS 中,HttpException 是用于处理 HTTP 异常的核心类。你可以使用它来创建自定义的异常响应。HttpException 的构造函数接受两个主要参数:
-
response(响应内容):这是可以返回给客户端的任意数据类型,通常是一个字符串或对象。它可以是错误消息、错误对象或其他信息。
-
status(状态码):这是 HTTP 响应的状态码,指定了错误的类型或状态。
new HttpException(response: string | object | any, status: number);
参数详解
response:
- 类型: string | object | any
- 说明: 这个参数是你希望发送给客户端的错误信息或数据。
- 如果是字符串,通常是错误消息。
- 如果是对象,你可以自定义更复杂的错误信息,比如包括错误码、详细描述等。
示例:
// 使用字符串作为响应内容
new HttpException('Not Found', HttpStatus.NOT_FOUND);
// 使用对象作为响应内容
new HttpException({
statusCode: HttpStatus.NOT_FOUND,
message: 'Resource not found',
error: 'Not Found'
}, HttpStatus.NOT_FOUND);
status:
- 类型: number
- 说明: 这是 HTTP 响应的状态码,表示异常的类型。可以是 HTTP 标准状态码,如 404 (Not Found)、500 (Internal Server Error) 等。
示例:
// 创建 404 Not Found 异常
new HttpException('Not Found', HttpStatus.NOT_FOUND);
// 创建 400 Bad Request 异常
new HttpException('Bad Request', HttpStatus.BAD_REQUEST);
自定义
自定义异常类通常是继承自 HttpException 的类。这允许你创建具有特定错误信息和状态码的异常。
// custom-exception.ts
import { HttpException, HttpStatus } from '@nestjs/common';
export class CustomNotFoundException extends HttpException {
constructor(message: string) {
super(message, HttpStatus.NOT_FOUND);
}
}
在这个例子中,CustomNotFoundException 类继承自 HttpException,并使用 HttpStatus.NOT_FOUND 作为默认状态码。
使用自定义异常类
在你的控制器或服务中,你可以抛出自定义异常类,以触发自定义的异常过滤器处理逻辑。
// cats.controller.ts
import { Controller, Get, Param } from '@nestjs/common';
import { CustomNotFoundException } from './custom-exception';
@Controller('cats')
export class CatsController {
@Get(':id')
findOne(@Param('id') id: string) {
if (id === 'not-found') {
throw new CustomNotFoundException('Cat not found with the provided ID');
}
// 其他逻辑...
return { id };
}
}