如何在单个NestJS应用中同时支持Multer文件上传与Raw Body?
如何在同一个NestJS(Fastify)应用中同时支持文件上传和Raw Body请求
当然可以让两种请求处理方式共存,核心是避免全局启用rawBody时与文件上传的multipart解析冲突,以下是两种可行方案:
方案一:路由级别单独配置Raw Body
不在全局启用rawBody,仅给需要Raw Body的路由单独开启该配置,文件上传路由保持默认即可:
- 创建应用时不设置全局rawBody:
const app = await NestFactory.create<NestFastifyApplication>( AppModule, new FastifyAdapter() );
- 文件上传路由代码保持不变:
@Post('upload') @UseInterceptors(FileInterceptor('file')) uploadFile(@UploadedFile() file: Express.Multer.File) { console.log(file); // 你的文件处理逻辑 }
- 给需要Raw Body的路由单独配置启用rawBody:
通过@Route装饰器传递Fastify路由配置,指定该路由启用rawBody:
import { Route, RawBodyRequest } from '@nestjs/common'; import { FastifyRequest } from 'fastify'; @Post('raw') @Route({ options: { rawBody: true, }, }) create(@Req() req: RawBodyRequest<FastifyRequest>) { const rawBodyBuffer = req.rawBody; // 你的Raw Body处理逻辑 }
方案二:全局启用Raw Body并过滤请求类型
如果需要全局支持Raw Body,可通过判断请求的Content-Type,仅对非multipart/form-data的请求启用rawBody,避免干扰文件上传的解析:
- 创建应用时配置rawBody为过滤函数:
const app = await NestFactory.create<NestFastifyApplication>( AppModule, new FastifyAdapter(), { rawBody: (req) => { // 仅对非multipart/form-data的请求启用rawBody return req.headers['content-type']?.toLowerCase() !== 'multipart/form-data'; }, }, );
- 文件上传和Raw Body路由代码保持你原本的实现即可:
文件上传路由:
@Post('upload') @UseInterceptors(FileInterceptor('file')) uploadFile(@UploadedFile() file: Express.Multer.File) { console.log(file); }
Raw Body路由:
@Post('raw') create(@Req() req: RawBodyRequest<FastifyRequest>) { const raw = req.rawBody; }
两种方案都能实现文件上传和Raw Body请求的共存,方案一更灵活,可精准控制哪些路由启用Raw Body;方案二更适合需要全局支持Raw Body的场景。
内容的提问来源于stack exchange,提问作者enigmatic
相关产品推荐
相关产品推荐

