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

这取决于您想要实现什么用例:您的客户端流程是否设计为分两步执行?stringfile 参数可以同时传递,还是每次调用都只有一个? (例如,如果您想更新 file 及其 name,或其他一些与 Multer 无关的属性)。 当您将字符串作为参数传递给端点调用时,file 资源是否已创建/更新/删除?或者可能根本没有?

根据您想到的答案和流程,您应该在两个独立的端点中拆分两个案例处理,或者同时处理两个参数可能是有意义的。

如果一次只能传递一个参数,我会说去两个独立的端点;您将从维护和代码可读性中受益。

如果可以同时传递两个参数并且它们与同一个资源相关,那么一次处理它们可能是有意义的。

希望这会有所帮助,不要犹豫发表评论;)

【讨论】:

感谢您的回答 :) 我的“源”参数是任何格式的文本(filestring),我将其转换为 Buffer后处理。一次只能传递一个文本对象以及一些选项(我的问题中的myDto)。由于每种情况的逻辑完全相同,我无法想象选择两个不同端点的充分理由。 好吧,那么我会选择一个可以处理stringfile 传入类型的自定义拦截器。如果其他人有更好/更优雅的方式来实现这一点,我建议他们添加他们的答案:)

以上是关于NestJS:以@UploadedFile 或String 作为参数的控制器函数的主要内容,如果未能解决你的问题,请参考以下文章

nestjs 文件上传

NestJS 中的 FileInterceptor 和 Body 问题(在请求中上传文件和数据)

请求正文中的布尔参数在 NestJS api 中始终为真

我需要帮助来验证 jwt 是不是有效或以其他方式创建一个新的,如果发送的令牌不正确,则在 nestjs 中间件中返回错误

NestJS 使用默认记录器或 npm(如 winston)登录文件、数据库等

我正在使用 cakephp 4.0。我尝试在 cloudinary 中上传图像(Laminas\Diactoros\UploadedFile)[关闭]