• 作者:老汪软件技巧
  • 发表时间:2024-10-09 00:01
  • 浏览量:

1. 前言

通过接口 GET /users/4 可以查询到 id 为 4 的用户信息,通过 GET /users/123 可以查询到 id 为 123 的用户信息,问题是数据库中并没有后者的数据,此时应该告诉前端没有这项数据。本篇将会讲解错误处理相关的内容,这将涉及到 NestJS 中的异常过滤器部分。

欢迎加入技术交流群。

NestJS ‍ 厨子必修课(一):后端的本质NestJS ‍厨子必修课(二):项目创建NestJS ‍厨子必修课(三):控制器NestJS ‍厨子必修课(四):服务类NestJS ‍厨子必修课(五):Prisma 集成(上)NestJS ‍厨子必修课(六):Prisma 集成(下)NestJS ‍厨子必修课(七):管道2. NotFoundException

通过 NotFoundException 实例直接抛出错误:

import { Injectable, NotFoundException } from '@nestjs/common';
@Injectable()
export class UsersService {
  constructor(private readonly prisma: PrismaService) {}
  
  async findOne(id: number) {
	  const user = await this.prisma.user.findUnique({
	    where: { id },
	    // 关联
	    include: {
	      orders: true,
	    },
	  });
	  if (!user) {
	    throw new NotFoundException('用户不存在');
	  }
	  return user;
	}
}

这里做了防御性编程,如果没有查询到用户,使用 throw new NotFoundException('用户不存在'); 抛出错误。

访问 :3000/users/123 后:

返回的 JSON 对象由以下字段组成:

除了 NotFoundException,NestJS 中还提供了以下内置的 HTTP 异常:

BadRequestException (400 Bad Request)

表示客户端发送的请求有错误,服务器无法处理。例如,参数缺失、无效输入等情况。

UnauthorizedException (401 Unauthorized)

表示请求没有经过身份验证或认证失败。通常出现在访问需要身份验证的资源时,客户端没有提供有效的认证信息。

ForbiddenException (403 Forbidden)

表示客户端的身份认证成功,但没有权限访问请求的资源。通常发生在权限不足时。

NotAcceptableException (406 Not Acceptable)

表示服务器无法生成客户端可以接受的响应格式。通常出现在客户端的 Accept 头与服务器支持的响应格式不匹配时。

RequestTimeoutException (408 Request Timeout)

表示客户端请求超时。服务器在等待请求时超过了设定的时间限制。

ConflictException (409 Conflict)

表示请求与服务器的当前状态存在冲突。例如,创建资源时,资源已经存在。

GoneException (410 Gone)

表示请求的资源已经永久不可用,并且不会再恢复。常用于删除的资源。

HttpVersionNotSupportedException (505 HTTP Version Not Supported)

表示服务器不支持客户端请求的 HTTP 协议版本。

PayloadTooLargeException (413 Payload Too Large)

表示客户端发送的数据体(如上传文件)超过了服务器允许的大小限制。

UnsupportedMediaTypeException (415 Unsupported Media Type)

表示客户端请求的媒体类型不被服务器支持。例如,上传文件的格式不被接受。

UnprocessableEntityException (422 Unprocessable Entity)

表示服务器理解客户端的请求内容,但由于语义错误而无法处理。例如,输入数据的格式正确但内容无效。

InternalServerErrorException (500 Internal Server Error)

表示服务器在处理请求时遇到了内部错误。是一个通用的错误状态码,表示服务器无法处理请求。

NotImplementedException (501 Not Implemented)

表示服务器不支持请求的方法。通常用于服务器不支持客户端请求的功能时。

ImATeapotException (418 I’m a teapot)

这是一个愚人节玩笑性质的 HTTP 状态码,表示服务器拒绝酿茶的请求(参见 IETF RFC 2324)。常用于测试或幽默场景。

MethodNotAllowedException (405 Method Not Allowed)

表示请求的方法(如 GET、POST)在目标资源中不可用。例如,资源只支持 GET 请求,而客户端使用了 POST。

BadGatewayException (502 Bad Gateway)

表示服务器作为网关或代理时,从上游服务器接收到无效响应。

ServiceUnavailableException (503 Service Unavailable)

表示服务器暂时无法处理请求,通常是因为过载或维护。

GatewayTimeoutException (504 Gateway Timeout)

表示服务器作为网关或代理时,从上游服务器接收响应超时。

PreconditionFailedException (412 Precondition Failed)

表示客户端发送的请求没有满足服务器的某些前置条件。例如,If-Match 头字段的条件不满足。

以上各种类型都可以从 @nestjs/common 包中导出使用,例如 BadRequestException:

// app.controller.ts
import { BadRequestException } from '@nestjs/common';
@Controller()
export class UsersController {
  @Get('test-error')
  testError() {
    throw new BadRequestException('测试错误');
  }
 
}