跳到主要内容

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;
}

源代码

feat: fetch axios · nest-first@67db6d0 · GitHub