Tsoa Node.js文件上传时@UploadedFile修饰的file参数始终为undefined
Tsoa文件上传file为undefined解决方法
- 移除接口内部无效的multer初始化代码
你在接口函数内编写的const mul = multer()不会产生任何作用,multer作为请求解析中间件必须注册在请求到达接口逻辑之前,放在接口内部时请求体已经完成解析,自然无法读取到文件内容。 - 开启tsoa配置的文件上传支持
找到项目根目录的tsoa.json配置文件,在spec节点下添加multer启用配置:
修改配置后需要重新运行tsoa命令生成路由和接口文档,配置才会生效。{ "spec": { "multer": { "enabled": true } } } - 调整中间件注册顺序
如果你使用手动注册multer的模式,必须保证multer中间件的注册顺序在express.json()、express.urlencoded()等其他body解析中间件之前,避免请求被提前解析导致multer无法读取原始请求数据:
注意import express from 'express'; import multer from 'multer'; const app = express(); // 优先注册multer中间件 app.use(multer().single('file')); // 再注册其他body解析中间件 app.use(express.json()); app.use(express.urlencoded({ extended: true }));multer().single('file')的参数要和文件字段名对应,如果前端上传文件的字段名不是file,需要同步修改该参数,同时@UploadedFile装饰器也要传入对应字段名,比如@UploadedFile('template')对应multer().single('template')。
如果你的Tsoa开启了自动生成路由功能,仅需保证tsoa.json中开启multer支持即可,不要手动重复注册multer,重复解析会直接导致文件参数为undefined。 - 修正普通参数的装饰器类型
multipart/form-data请求中携带的普通文本参数不会出现在query参数中,你当前使用@Query()修饰的templateName、unit、testWith参数无法获取到正确值,需要替换为@FormField()装饰器。 - 确认请求格式正确
调用接口时必须设置请求头Content-Type: multipart/form-data,不要手动指定boundary值,由请求客户端自动生成即可。
内容的提问来源于stack exchange,提问作者Ahmed Hekal
相关产品推荐
相关产品推荐

