ChuChencheng / note

菜鸡零碎知识笔记
Creative Commons Zero v1.0 Universal
3 stars 0 forks source link

NestJS 修改 POST 请求 body 大小限制 #46

Open ChuChencheng opened 3 years ago

ChuChencheng commented 3 years ago

关于 POST 请求的大小限制

根据网上随处可查到的资料,HTTP 规范没有强制限制 POST 请求内容的大小,一般是由浏览器或者服务端去限制。

NestJS 对 POST 请求的限制

最近在写 NestJS 时,遇到了一个报错 request entity too large 显然,字面上看,就是请求的 body 太大,超过了 NestJS 的限制

我们使用的是默认的底层,也就是 express ,因此这个是由 express 那边限制的 从 express 官方文档 也可以看到,默认限制是 100kb

image

修改限制

根据上述文档,我们只需要能修改那个 limit 配置即可

我们在 NestJS 项目的 main.ts 中加入以下代码:

app.use(express.json({ limit: '1mb' }))

这行代码可以成功运行,问题似乎也解决了。

但是这边有个隐藏的坑:

当我们使用 nest-cli 初始化项目后,可以看到在 package.json 中有 @types/express 这个包,但没有 express 本体。 由于 NestJS 底层默认使用 express ,因此 node_modules 里一般是会存在 express 包的。 因此我们用 import * as express from 'express' 引入使用 express 的功能,也是能正常运行的。

然而,在代码中使用 package.json 中没有声明的依赖,肯定是有风险的。 如果我们只使用 express 的 TypeScript 类型声明,那没问题,上述这个机制反而方便了开发。 但是我们使用了具体的功能,假设以后整个仓库换了 npm 包管理工具, node_modules 里面的依赖不再是扁平的,那代码就无法运行了。

做法1

因此,更保险的做法,我们可以只引入 express 底层用的 body-parser 库:

import * as bodyParser from 'body-parser'

app.use(bodyParser.json({ limit: '1mb' }))

做法2

当然,我们也可以直接在我们的依赖包里加上 express

预想

其实最好的做法还是 NestJS 官方提供个配置供修改

ChuChencheng commented 1 year ago

https://docs.nestjs.com/faq/raw-body#body-parser-size-limit NestJS 已内置