typescript Nestjs使用@UploadedFile装饰器上传文件:如何使参数非强制性?

rekjcdws  于 2023-01-03  发布在  TypeScript
关注(0)|答案(1)|浏览(212)

在Nest.js中,我试图为我的膳食计划应用程序中的一种配料编写一个创建(Post)路径。该路径将作为请求主体,包含一个描述(可选)和一个名称(强制),以及一个可选的图像。我将Objection.js用作一个ORM。
我阅读了Nest.js文档中的File Uploading Nest.js File Upload handling with Multer,并尝试按照文档中的方法进行操作。问题是,我找不到任何地方如何在使文件可选的同时使用UploadedFile装饰器。当我尝试通过Postman创建一个没有图像的新成分时,我收到了以下错误消息:

{
    "statusCode": 400,
    "message": "File is required",
    "error": "Bad Request"
}

有没有人在这里偶然发现这个问题,并找到了一个解决方案,使参数可选?我知道我可以创建一个补丁路径来修改成分,并添加一个图像后,作为一个变通方案,但我想知道是否有什么我可以做的,同时保持实际的。
这是我的控制器的代码:

@Post()
  @UseInterceptors(
    FileInterceptor('image', {
      storage: diskStorage({
        destination: './assets/images/ingredient',
        filename: getUniqueFileName,
      }),
    }),
  )
  @UseFilters(DeleteFileOnErrorFilter)
  async create(
    @Body() dto: CreateIngredientDto,
    @UploadedFile(
      new ParseFilePipe({
        validators: [new FileTypeValidator({ fileType: '.(png|jpeg|jpg)' })],
      }),
    )
    image?: Express.Multer.File,
  ): Promise<IngredientModel> {
    return this.ingredientService.create(dto, image);
  }

以及从服务调用的create方法:

async create(
    dto: CreateIngredientDto,
    image?: Express.Multer.File,
  ): Promise<IngredientModel> {
    try {
      return await ImageModel.transaction(async () => {
        if (image) {
          const imagePath = await ImageModel.query().insert({
            location: image.path,
          });
          return this.modelClass
            .query()
            .insert({ ...dto, imageId: imagePath.id });
        }
        return this.modelClass.query().insert({ ...dto });
      });
    } catch (err) {
      this.logger.error('An error occurred while creating the ingredient');
      return null;
    }
  }
nbnkbykc

nbnkbykc1#

您可以将fileIsRequired作为false传递给ParseFilePipe类。

@UploadedFile(
  new ParseFilePipe({
    validators: [new FileTypeValidator({ fileType: '.(png|jpeg|jpg)' })],
    fileIsRequired: false,
  }),
)

相关问题