首页 > 解决方案 > 文件字段未包含在 NestJS 的 @Body 装饰器中

问题描述

我正在尝试构建一个简单的路线,用户将在其中发布少量文本数据以及文件。假设一个任务的属性是标题、描述和文件。我为此创建了一个 DTO,如下所示:-

export class CreateTaskDto {
  title: string;
  description: string;
  file: any
}

这是storage.config.ts

export const storage = diskStorage({
  destination: "./uploads",
  filename: (req, file, callback) => {
    callback(null, generateFilename(file));
  }
});

function generateFilename(file) {
  const filename = file.originalname
  const ext = filename.split(".").pop()
  return `${Date.now()}_${filename}`;
}

tasks.controller.ts

@Post()
@UseInterceptors( FileInterceptor( "file", { storage }))
async createNewTask(@UploadedFile() file, @Body() dto: CreateTaskDto) {
  /*
   here is the dto I received:
   {
      "title": "Task Title",
      "description": "Task Description"
   }

   You can see that the file field is not being added to the dto
   */
}

file字段数据不包含在装饰@Body器变量dto中。我知道我可以通过file变量访问文件数据,但是有没有办法指示嵌套将文件值包含到 @Body 装饰器中?

谢谢

标签: node.jstypescriptnestjs

解决方案


这就是multer工作原理,它获取上传的文件并将它们附加到req.filereq.files取决于是否发送了一个或多个。如果需要,您可以创建一个自定义装饰器req.bodyand合并req.file在一起,但通常这不是 Nest 所做的,而是底层包本身。


推荐阅读