一、 中间件(Middleware)
1.特点
中间件是一个在路由处理程序之前被调用的函数。中间件函数可以访问请求和响应对象,以及应用程序请求-响应周期中的next()中间件函数。下一个中间件函数通常由一个名为next的变量表示。
中间件函数可以执行以下任务:
1、执行任何代码。
2、对请求和响应对象进行更改。
3、结束请求-响应周期。
4、调用堆栈中的下一个中间件函数。
如果当前中间件函数没有结束请求-响应周期,它必须调用next()将控制传递给下一个中间件函数。否则,请求将被挂起。
支持依赖注入的方式进行使用
2.1 应用中间件
LoggerMiddleware将被绑定到catscontroller内部定义的所有路由,除了传递给exclude()方法的三个路由。
javascript
//logger.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
use(req: Request, res: Response, next: NextFunction) {
console.log('Cross Middleware ,Request...');
next();
}
}
javascript
//app.module.ts
@Module({
imports: [KeysModule, UsersModule, DatabaseModule, LoggerModule],
controllers: [AppController],
providers: [AppService],
})
export class AppModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
// 从中间件中排除一些路由
//.exclude(
// { path: 'users', method: RequestMethod.GET },
// { path: 'users', method: RequestMethod.POST },
// 'users/(.*)',
//)
// .forRoutes('users');
// .forRoutes({ path: 'users', method: RequestMethod.GET });
.forRoutes(UsersController);
}
}
测试结果:
二、异常过滤器(Exception filters)
1.特点
Nest有一个内置的异常层,负责处理整个应用程序中所有未处理的异常。当应用程序代码没有处理异常时,该层将捕获异常,然后自动发送适当的用户友好响应。
当异常无法识别时(既不是HttpException也不是继承自HttpException的类),内置异常过滤器会生成以下默认JSON响应:
javascript
{
"statusCode": 500,
"message": "Internal server error"
}
相关的HTTP 状态码,可以参考https://seo.juziseo.com/doc/http_code/
2.1 抛出标准的异常
javascript
@Get()
findAll() {
// return this.keysService.findAll();
throw new HttpException('Forbideden', HttpStatus.FORBIDDEN);
}
2.2 自定义异常
javascript
//forbidden.exception.ts
export class ForBiddenException extends HttpException {
constructor() {
super('Forbidden', HttpStatus.UNAUTHORIZED);
}
}
javascript
//keys.controller.ts
@Get()
findAll() {
// return this.keysService.findAll();
// throw new HttpException('Forbideden', HttpStatus.FORBIDDEN);
throw new ForBiddenException();
}
2.3 Http内置的Http异常
BadRequestException
- 客户端发送了一个服务器无法理解的请求。
UnauthorizedException
- 客户端需要进行身份验证才能访问请求的资源。
NotFoundException
- 服务器找不到请求的资源。
ForbiddenException
- 客户端没有权限访问请求的资源。
NotAcceptableException
- 服务器无法根据请求的内容特性完成请求。
RequestTimeoutException
- 客户端请求超时。
ConflictException
- 表示请求与服务器当前状态冲突。
GoneException
- 表示请求的资源不再可用。
HttpVersionNotSupportedException
- 表示服务器不支持请求中使用的 HTTP 版本
PayloadTooLargeException
- 表示请求的负载过大,服务器无法处理。
UnsupportedMediaTypeException
- 表示服务器不支持请求中的媒体类型。
UnprocessableEntityException
- 表示服务器无法处理请求的实体。
InternalServerErrorException
- 表示服务器遇到了意外的情况,无法完成请求。
NotImplementedException
- 表示服务器不支持请求中要求的功能。
ImATeapotException
- 表示服务器是一个茶壶,不支持被要求的操作。
MethodNotAllowedException
- 表示服务器不支持请求中指定的方法。
BadGatewayException
- 表示服务器作为网关或代理时从上游服务器接收到无效响应。
ServiceUnavailableException
- 表示服务器暂时无法处理请求。
GatewayTimeoutException
- 表示服务器作为网关或代理时无法从上游服务器获取响应,超时了。
PreconditionFailedException
- 表示请求头中指定的条件不满足。