You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单个NestJS应用中同时支持Multer文件上传与Raw Body?

如何在同一个NestJS(Fastify)应用中同时支持文件上传和Raw Body请求

当然可以让两种请求处理方式共存,核心是避免全局启用rawBody时与文件上传的multipart解析冲突,以下是两种可行方案:

方案一:路由级别单独配置Raw Body

不在全局启用rawBody,仅给需要Raw Body的路由单独开启该配置,文件上传路由保持默认即可:

  1. 创建应用时不设置全局rawBody:
const app = await NestFactory.create<NestFastifyApplication>(
  AppModule,
  new FastifyAdapter()
);
  1. 文件上传路由代码保持不变:
@Post('upload')
@UseInterceptors(FileInterceptor('file'))
uploadFile(@UploadedFile() file: Express.Multer.File) {
  console.log(file);
  // 你的文件处理逻辑
}
  1. 给需要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,避免干扰文件上传的解析:

  1. 创建应用时配置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';
    },
  },
);
  1. 文件上传和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:12:49