NestJS-一些补充
在Nest中有一些功能只需要通过一两行代码就能帮你搞定
允许跨域(CORS)
在Nest中内置了对CORS的支持,只需要一行代码就能启用CORS
app.enableCors();
// 或者在创建app的时候就启用,但是似乎支队restfulapi有效
const app = await NestFactory.create(AppModule, { cors: true });
也可以给enbaleCors方法传入更多的参数去控制域名和请求类型,具体可以参考:GitHub - expressjs/cors: Node.js CORS middleware
跨站请求伪造(CSRF)
在Nest中需要安装额外的包来处理CSRF
$ yarn add csurf
然后修改main.ts
// 在文件头部导入
import * as csurf from 'csurf';
// 在bootstrap方法中使用中间件
app.use(csurf());
也可以通过传参数控制,具体的参数可以安装类型包去查看
$ yarn add -D @types/csurf
压缩(Compression)
Nest需要额外安装包给返回的内容进行压缩处理
$ yarn add compression
然后修改main.ts
// 在头部导入
import * as compression from 'compression';
// 修改bootstrap方法
app.use(compression());
如果需要用到更多的配置可以通过安装类型包查看
$ yarn add -D @types/compression
安全帽(Helmet)
Helmet可以通过适当地设置HTTP头来帮助保护你的应用程序免受一些著名的网络漏洞的影响。一般来说,Helmet只是一个由14个较小的中间件函数组成的集合,用于设置与安全有关的HTTP头信息。
安装依赖
$ yarn add helmet
使用
// main.ts
import helmet from 'helmet';
// bootstrap
app.use(helmet());
// app.use(helmet());等价下面的代码
app.use(helmet.contentSecurityPolicy());
app.use(helmet.crossOriginEmbedderPolicy());
app.use(helmet.crossOriginOpenerPolicy());
app.use(helmet.crossOriginResourcePolicy());
app.use(helmet.dnsPrefetchControl());
app.use(helmet.frameguard());
app.use(helmet.hidePoweredBy());
app.use(helmet.hsts());
app.use(helmet.ieNoOpen());
app.use(helmet.noSniff());
app.use(helmet.originAgentCluster());
app.use(helmet.permittedCrossDomainPolicies());
app.use(helmet.referrerPolicy());
app.use(helmet.xssFilter());
限流(Rate limiting)
保护应用程序免受暴力攻击的常用技术是速率限制。在Express平台中有许多软件包都提供了速率限制的功能。我们使用其中最最最常用的一个express-rate-limit
安装
$ yarn add express-rate-limit
使用
// main.ts
import { rateLimit } from 'express-rate-limit';
// 每个IP每10分钟最多300个请求
app.use(rateLimit({
windowMs: 1000 * 60 * 10,
max: 300
}));
在反向代理中
Express可能没有办法正确的获得客户端的真正IP,这个时候可以使用app.set('trust proxy', true)来支持X-Forwarded-Proto(协议代理)X-Forwarded-For(ip代理),X-Forwarded-Host(主机代理)。这在heroku中可能非常实用。
发送请求(Fetch-axios)
在Nest中你可以使用任何请求库来发送http请求。但是官方推荐的是axios姑且先用它
安装依赖
$ yarn add @nestjs/axios axios
开始使用
1、导入到需要使用的模块中
imports: [HttpModule]
2、在需要调用的类中注入HttpService
constructor(private readonly httpService: HttpService,) {}
3、在方法中使用
async fetchBaidu() {
const res = this.httpService.get<string>("https://baidu.com");
const baidu = await lastValueFrom(res);
return baidu.data;
}