NestJS:以@UploadedFile 或String 作为参数的控制器函数
Posted
技术标签:
【中文标题】NestJS:以@UploadedFile 或String 作为参数的控制器函数【英文标题】:NestJS: Controller function with @UploadedFile or String as a parameter 【发布时间】:2020-01-06 13:34:28 【问题描述】:我正在使用 NestJS(版本 6.5,带有 Express 平台),我需要处理一个属性可以是文件或字符串的请求。
这是我目前拥有的代码,但我没有找到一种干净的方法来实现它。
MyAwesomeController
@Post()
@UseInterceptors(FileInterceptor('source'))
async handle(@UploadedFile() source, @Body() myDto: MyDto): Promise<any>
//do things...
我是否遗漏了一些明显的东西,或者我应该编写自己的拦截器来处理这种情况? 设计方面,这很糟糕吗?
【问题讨论】:
【参考方案1】:基于您正在设计 REST API:
这取决于您想要实现什么用例:您的客户端流程是否设计为分两步执行?string
和 file
参数可以同时传递,还是每次调用都只有一个? (例如,如果您想更新 file
及其 name
,或其他一些与 Multer 无关的属性)。
当您将字符串作为参数传递给端点调用时,file
资源是否已创建/更新/删除?或者可能根本没有?
根据您想到的答案和流程,您应该在两个独立的端点中拆分两个案例处理,或者同时处理两个参数可能是有意义的。
如果一次只能传递一个参数,我会说去两个独立的端点;您将从维护和代码可读性中受益。
如果可以同时传递两个参数并且它们与同一个资源相关,那么一次处理它们可能是有意义的。
希望这会有所帮助,不要犹豫发表评论;)
【讨论】:
感谢您的回答 :) 我的“源”参数是任何格式的文本(file
、string
),我将其转换为 Buffer
后处理。一次只能传递一个文本对象以及一些选项(我的问题中的myDto
)。由于每种情况的逻辑完全相同,我无法想象选择两个不同端点的充分理由。
好吧,那么我会选择一个可以处理string
和file
传入类型的自定义拦截器。如果其他人有更好/更优雅的方式来实现这一点,我建议他们添加他们的答案:)以上是关于NestJS:以@UploadedFile 或String 作为参数的控制器函数的主要内容,如果未能解决你的问题,请参考以下文章
NestJS 中的 FileInterceptor 和 Body 问题(在请求中上传文件和数据)
我需要帮助来验证 jwt 是不是有效或以其他方式创建一个新的,如果发送的令牌不正确,则在 nestjs 中间件中返回错误
NestJS 使用默认记录器或 npm(如 winston)登录文件、数据库等
我正在使用 cakephp 4.0。我尝试在 cloudinary 中上传图像(Laminas\Diactoros\UploadedFile)[关闭]