我正在开发一个 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
我只是偶然发现了这个,你的帖子帮助我找到了解决方案。
image: z.custom<Express.Multer.File>().openapi({
type: 'string',
description: 'The image to classify',
format: 'binary'
})
这似乎与 ValidationPipe 配合得很好,但仍然保持 openapi 规范的正确性。