返回

NestJS 精彩解析,让你瞬间变身技术达人 - 这可能是你看过最全的 NestJS 教程!

前端

统一返回

让我们从一个统一的返回体开始。这是一个拦截器,它将应用于您的所有控制器。这样,无论您的代码在何处运行,您都可以使用相同的返回结构。

如何使用

创建一个名为 TransformInterceptor 的拦截器,如下所示:

import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable()
export class TransformInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle().pipe(map(data => ({ data })));
  }
}

然后,在您的 app.module.ts 文件中注册这个拦截器:

import { Module } from '@nestjs/common';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { TransformInterceptor } from './transform.interceptor';

@Module({
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: TransformInterceptor,
    },
  ],
})
export class AppModule {}

现在,每次您返回数据时,它都会被包裹在一个标准对象中。这使得您的代码更一致,也更容易调试。

和Dto冲突了怎么办?

如果您在使用 DTO 时遇到冲突,您可以通过在控制器方法中使用 @UseInterceptors(ClassSerializerInterceptor) 装饰器来解决此问题。这将告诉 NestJS 使用 class-transformer 库来序列化您的 DTO,这将与 TransformInterceptor 一起工作。

认证

NestJS 内置对 JWT 认证的支持。要启用它,您需要在您的 app.module.ts 文件中导入 JwtModule 并将其添加到您的导入数组中:

import { Module } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core';
import { JwtModule } from '@nestjs/jwt';
import { JwtAuthGuard } from './jwt-auth.guard';

@Module({
  imports: [
    JwtModule.register({
      secret: 'your-secret-key',
    }),
  ],
  providers: [
    {
      provide: APP_GUARD,
      useClass: JwtAuthGuard,
    },
  ],
})
export class AppModule {}

现在,您可以在控制器方法中使用 @UseGuards(JwtAuthGuard) 装饰器来保护您的路由。这将确保只有经过身份验证的用户才能访问这些路由。

冲突了怎么办?

如果您在使用 JWT 时遇到冲突,您可以通过在您的控制器方法中使用 @UseGuards(AuthGuard('other')) 装饰器来解决此问题。这将告诉 NestJS 使用其他类型的身份验证,例如本地身份验证或第三方身份验证。

细心的小伙伴。已经发现了上面的问题了,那就是,如果我没有验证通过或

没有经过身份验证,我仍然可以通过直接调用控制器方法来访问受保护的路由。为了解决这个问题,您可以在您的控制器方法中使用 @UsePipes(ValidationPipe) 装饰器。这将确保只有有效的请求才能通过。

结论

NestJS 是一个功能强大且易于使用的后端框架。它可以帮助您快速轻松地构建复杂的应用程序。在本教程中,您学习了如何使用 NestJS 来处理统一返回体、文件服务、单点登录、Job 和部署。您还学习了如何使用过滤器来定制你的返回对象,使得你能够根据需要进行个性化设置。