这是我参与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