NestJS 精彩解析,让你瞬间变身技术达人 - 这可能是你看过最全的 NestJS 教程!
2023-10-23 12:45:39
统一返回
让我们从一个统一的返回体开始。这是一个拦截器,它将应用于您的所有控制器。这样,无论您的代码在何处运行,您都可以使用相同的返回结构。
如何使用
创建一个名为 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 和部署。您还学习了如何使用过滤器来定制你的返回对象,使得你能够根据需要进行个性化设置。