NestJS Swagger 与 Zod 的多部分文件上传问题

问题描述 投票:0回答:1

我正在开发一个 NestJS 应用程序,并使用 Nestjs-zod 库进行验证和 swagger 文档。但是,当我尝试在多部分表单数据请求中上传文件时,我遇到了问题。

问题是我用于验证的 zod 没有特定的文件类型,并且 Swagger 无法将其识别为文件输入,因为它缺少 @ApiProperty({ format: 'binary' }) 装饰。我正在寻找一种解决方案来使用 zod 正确记录和验证多部分文件上传同时我想继续使用我正在做的 Dtos

dto.ts

import { createZodDto } from 'nestjs-zod/dto';
import * as z from 'nestjs-zod/z';

export const schema = z.object({
  field: z.string().optional(),
  requiredFile: z
    .string()
    .refine((str: any): str is Buffer => Buffer.isBuffer(Buffer.from(str))),
  optionalFile: z
    .string()
    .refine((str: any): str is Buffer => Buffer.isBuffer(Buffer.from(str)))
    .optional(),
});

export class Dto extends createZodDto(schema) {}

controller.ts

@Post()
@UseInterceptors(
  FileFieldsInterceptor(
    [{ name: 'requiredFile' }, { name: 'optionalFile' }],
    multerLimits,
  ),
)
@ApiConsumes('multipart/form-data')
async create(
  @Body() dto: CreateStoreDto,
  @UploadedFiles()
  files,
) {
  // Handle the request...
}

我也尝试使用

zod-to-openapi
包,但没有任何改变!

dto2.ts

import { createZodDto } from 'nestjs-zod/dto';
import { z as z2 } from 'nestjs-zod/z';
import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi';

extendZodWithOpenApi(z2);

export const schema = z2.object({
  optionalFile: z2
    .custom<Express.Multer.File>()
    .openapi({ format: 'binary', type: 'string' }),
  requiredFile: z2
    .string()
    .refine((str: any): str is Buffer => Buffer.isBuffer(Buffer.from(str)))
    .openapi({ type: 'string', format: 'binary' }),
});

export class Dto extends createZodDto(schema) {}

我也尝试过

  file3: z2.string().openapi({ type: 'string', format: 'binary' }),

但这也不起作用

这里是 github 存储库,您可以分叉并尝试 PR 来解决问题: https://github.com/mohrazzak/nodejs

The below image shows that swagger is not recognizing the files as binary files or whatever
But swagger recognize it as string

typescript swagger nestjs openapi zod
1个回答
0
投票

我只是偶然发现了这个,你的帖子帮助我找到了解决方案。

    image: z.custom<Express.Multer.File>().openapi({
      type: 'string',
      description: 'The image to classify',
      format: 'binary'
    })

这似乎与 ValidationPipe 配合得很好,但仍然保持 openapi 规范的正确性。

© www.soinside.com 2019 - 2024. All rights reserved.