带有multipart / form-data和@ApiImplicitBody的Swagger文档

时间:2019-01-16 12:38:03

标签: javascript node.js typescript swagger nestjs

我正在尝试创建一个控制器动作,该动作必须上传一些文件并将它们与一些字符串一起保存到数据库中。 对于上传文件,我使用FileFieldsInterceptor,对于其他数据字符串,则使用DTO。有用。 但是我想用草率的文档记录此端点,但它不起作用。对于文件,我可以将@ApiImplicitFile@ApiConsumes('multipart/form-data')一起使用,但是对于其他主体参数,我尝试使用@ApiImplicitBody装饰器,应用会崩溃,并在api-parameters.explorer.js中出现错误。

如何通过multipart/form-data模块将主体参数(文件以外的文件)记录到@nestjs/swagger中?

@Post()
@ApiOperation({ ...config.api.post })
@ApiConsumes('multipart/form-data')
@ApiImplicitFile({ name: 'file', required: true, description: 'Infographic file' })
@ApiImplicitFile({ name: 'file_preview', required: true, description: 'Infographic preview file' })
@ApiImplicitBody({ name: 'name', required: true, description: 'Infographic title', type: 'string' })
@UseInterceptors(FileFieldsInterceptor([
        { name: 'file', maxCount: 1 },
        { name: 'file_preview', maxCount: 1 },
    ],
    {
        storage: storageUpload('infographics'),
        limits: {
            fileSize: 20971520, // 20Mb
        },
        fileFilter: (req, file, cb) => {
            const mimeTypeList = ['image/png', 'image/jpeg', 'application/pdf'];

            return mimeTypeList.some(item => item === file.mimetype)
                ? cb(null, true)
                : cb(null, false);
        },
    },
  ), new FilesValidationInterceptor())
upload(@UploadedFiles() files, @Body() createDto: CreateInfographicsDto) {
    return this.infographicsService.create(files, createDto);
}

1 个答案:

答案 0 :(得分:0)

错误

对于类型,您必须使用String而不是'string'

@ApiImplicitBody({ name: 'name', description: 'Infographic title', type: String })
                                                                         ^^^^^^


表格数据

根据此github issue,@ nestjs / swagger尚不支持记录表单数据参数。已经存在pull request,可以添加此功能,但尚未合并。您可以订阅它以在状态更新时得到通知。