迁移指南

本文提供了一套从v4迁移到最新v5版本的指导原则。在开发过程中,我们花了很多时间试图避免任何重大改变。尽管如此,为了简化它的使用,API必须在一堆地方进行更改。此外,以前的版本由于已经做出的决定而受到限制。

模板

为了减少Nest和Angular之间的差异数量,根据@Module()装饰器进行了很少的更改。

  • 模块属性现在已被弃用,改用导入
  • 组件属性现在已被弃用,改为使用提供者

装饰器

@Component()@Middleware()@Interceptor()@Pipe()@Guard()现在已弃用。使用@Injectable()来代替。

中间件

我们不再完全支持传统的快递中间件模型,也就是说,无论请求方式如何,每个中间件现在都只限于一条路径。而且,不会有更多的错误中间件。这一变化有助于我们在可移植性和兼容性之间找到中间立场。

  1. // Before
  2. consumer.apply(LoggerMiddleware).forRoutes(
  3. { path: '/cats', method: RequestMethod.GET },
  4. { path: '/cats', method: RequestMethod.POST },
  5. );
  6. // After
  7. consumer.apply(LoggerMiddleware).forRoutes('cats');

但是,如果您仍然需要将中间件绑定到特定的请求方法,则可以直接使用快速实例。

  1. const app = await NestFactory.create(ApplicationModule);
  2. app.get('cats', logger);

推荐的方法是使用管道,警卫或拦截器。

消费者

MiddlewaresConsumer类已更改为MiddlewareConsumer

过滤器

异常过滤器不再作为单一范式被锁定。以前,异常过滤器可以访问响应对象。与传入的发行版一起,catch()方法取而代之使用ArgumentsHost实例。

  1. // Before
  2. @Catch(HttpException)
  3. export class HttpExceptionFilter implements ExceptionFilter {
  4. catch(exception: HttpException, response) {}
  5. }
  6. // After
  7. @Catch(HttpException)
  8. export class HttpExceptionFilter implements ExceptionFilter {
  9. catch(exception: HttpException, host: ArgumentsHost) {
  10. const response = host.switchToHttp().getResponse();
  11. // ...
  12. }
  13. }

看守器

与过滤器一样,看守器现在更加灵活。访问增强的ExecutionContext让守卫更加超级强大,并且所有这些都是在简化的API基础上构建的。

  1. // Before
  2. @Guard()
  3. export class RolesGuard implements CanActivate {
  4. canActivate(
  5. dataOrRequest,
  6. context: ExecutionContext,
  7. ): boolean | Promise<boolean> | Observable<boolean> {
  8. return true;
  9. }
  10. }
  11. // After
  12. @Injectable()
  13. export class RolesGuard implements CanActivate {
  14. canActivate(
  15. context: ExecutionContext,
  16. ): boolean | Promise<boolean> | Observable<boolean> {
  17. // const request = context.switchToHttp().getRequest();
  18. return true;
  19. }
  20. }

拦截器

拦截器API的演变方式与等效的看守器API完全相同

  1. // Before
  2. @Interceptor()
  3. export class TransformInterceptor implements NestInterceptor {
  4. intercept(
  5. dataOrRequest,
  6. context: ExecutionContext,
  7. stream$: Observable<any>,
  8. ): Observable<any> {
  9. return stream$.map((data) => ({ data }));
  10. }
  11. }
  12. // After
  13. @Injectable()
  14. export class TransformInterceptor implements NestInterceptor {
  15. intercept(
  16. context: ExecutionContext,
  17. call$: Observable<T>,
  18. ): Observable<Response<T>> {
  19. // const request = context.switchToHttp().getRequest();
  20. return call$.pipe(map(data => ({ data })));
  21. }
  22. }

自定义装饰器

createRouteParamDecorator()函数现在已被弃用。现在使用createParamDecorator()