在 NestJS 上将 DTO 与 multipart/form-data 一起使用时出现空对象

Vin*_*tes 2 multipartform-data dto multer nestjs

在我的后端,我有这个端点:

@Post()
@UseInterceptors(FilesInterceptor('files'))
create(
  @UploadedFiles() files: Array<Express.Multer.File>,
  @Body() body: MyDto,
  ) {
  console.log(body);
  console.log(files);
}
Run Code Online (Sandbox Code Playgroud)

MyDto很简单:

export class MyDto {

  year: string
}
Run Code Online (Sandbox Code Playgroud)

当我multipart/form-data仅使用字段或与一个或多个文件一起发送请求(在 Firefox、Chrome 和 Postman 上尝试使用代码)时year,我从第一个console.log(打印 的那个body)中得到:

MyDto {}
Run Code Online (Sandbox Code Playgroud)

当我从正文中删除输入时,端点变为:

@Post()
@UseInterceptors(FilesInterceptor('files'))
create(
  @UploadedFiles() files: Array<Express.Multer.File>,
  @Body() body,
  ) {
  console.log(body);
  console.log(files);
}
Run Code Online (Sandbox Code Playgroud)

本体如图所示:

[Object: null prototype] { year: '2022' }
Run Code Online (Sandbox Code Playgroud)

变量files总是正确的。
如何设置正文的类型?

main.ts的如下:

const app = await NestFactory.create(AppModule, {
    logger: ['log', 'error'],
  });
  app.enableCors();
  app.useGlobalPipes(
    new ValidationPipe({
      whitelist: true,
      transform: true,
    })
  );
  app.use(bodyParser.json({limit: '1mb'}));
  app.use(bodyParser.urlencoded({limit: '1mb', extended: true}));
  const appVersion = '0.0.1';
  const port = process.env.PORT || 3000;
  await app.listen(port);
Run Code Online (Sandbox Code Playgroud)

Jay*_*iel 5

您缺少year类属性上的任何装饰器MyDto,并且因为您有whitelist: true,class-validator将删除非白名单值(即与类的装饰属性不匹配的值)