身为前端的你想学后端吗?来学Nest吧[三]

这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

守卫

守卫是一个使用 @Injectable() 装饰器的类。 守卫应该实现 CanActivate 接口。

在传统的express或者是koa中,都是用中间件处理授权,因为诸如token验证与request对象附加属性没有强关联

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';

@Injectable()
export class RolesGuard implements CanActivate {
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    const req = context.switchToHttp().getRequest<Request>()
    return !!req.headers.authorization;
  }
}
复制代码

然后再controller加入即可

@Controller('cats')
@UseGuards(new RolesGuard())
export class CatsController {}
复制代码

拦截器

拦截器具有一系列有用的功能,这些功能受面向切面编程(AOP)技术的启发。它们可以:

  • 在函数执行之前/之后绑定额外的逻辑
  • 转换从函数返回的结果
  • 转换从函数抛出的异常
  • 扩展基本函数行为
  • 根据所选条件完全重写函数 (例如, 缓存目的)

安全

CORS

const app = await NestFactory.create(ApplicationModule);
app.enableCors();
await app.listen(3000);
复制代码

CSRF

npm i --save csurf

import * as csurf from 'csurf';
// somewhere in your initialization file
app.use(csurf());
复制代码

限速

防止暴力攻击

npm i --save express-rate-limit
import * as rateLimit from 'express-rate-limit';
// somewhere in your initialization file
app.use(
  rateLimit({
    windowMs: 15 * 60 * 1000, // 15 minutes
    max: 100, // limit each IP to 100 requests per windowMs
  }),
);
复制代码

技术

缓存

缓存是一项伟大而简单的技术,可以帮助提高应用程序的性能。它充当临时数据存储,提供高性能的数据访问。

npm install --save cache-manager

import { CacheModule, Module } from '@nestjs/common';
import { AppController } from './app.controller';

@Module({
  imports: [CacheModule.register()],
  controllers: [AppController],
})
export class ApplicationModule {}
复制代码

然后将 CacheInterceptor 绑定到需要缓存数据的地方。

@Controller()
@UseInterceptors(CacheInterceptor)
export class AppController {
  @Get()
  findAll(): string[] {
    return [];
  }
}
复制代码

警告: 只有使用 GET 方式声明的节点会被缓存。此外,注入本机响应对象( @Res() )的 HTTP 服务器路由不能使用缓存拦截器。有关详细信息,请参见响应映射。

全局缓存

为了减少重复代码量,可以一次绑定 CacheInterceptor 到每个现有节点:

import { CacheModule, Module, CacheInterceptor } from '@nestjs/common';
import { AppController } from './app.controller';
import { APP_INTERCEPTOR } from '@nestjs/core';

@Module({
  imports: [CacheModule.register()],
  controllers: [AppController],
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useClass: CacheInterceptor,
    },
  ],
})
export class ApplicationModule {}
复制代码

定时任务

npm install --save @nestjs/schedule

import { Module } from '@nestjs/common';
import { ScheduleModule } from '@nestjs/schedule';

@Module({
  imports: [ScheduleModule.forRoot()],
})
export class AppModule {}
复制代码

声明定时任务

import { Injectable, Logger } from '@nestjs/common';
import { Cron } from '@nestjs/schedule';

@Injectable()
export class TasksService {
  private readonly logger = new Logger(TasksService.name);

  @Cron('45 * * * * *')
  handleCron() {
    this.logger.debug('Called when the current second is 45');
  }
}
复制代码

使用Cron执行定时任务

每分钟执行依次,在45秒执行

  • 星号通配符 (也就是 *)
  • 范围(也就是 1-3,5)
  • 步长(也就是 */2)
* * * * * *
| | | | | |
| | | | | day of week
| | | | month
| | | day of month
| | hour
| minute
second (optional)

复制代码
名称 含义
            • | 每秒

45 * * * * * | 每分钟第 45 秒 _ 10 _ * * * | 每小时,从第 10 分钟开始 0 _/30 9-17 _ * * | 上午 9 点到下午 5 点之间每 30 分钟 0 30 11 * * 1-5 | 周一至周五上午 11:30

猜你喜欢

转载自juejin.im/post/7031120175059435550