You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tsoa Node.js文件上传时@UploadedFile修饰的file参数始终为undefined

Tsoa文件上传file为undefined解决方法
  • 移除接口内部无效的multer初始化代码
    你在接口函数内编写的const mul = multer()不会产生任何作用,multer作为请求解析中间件必须注册在请求到达接口逻辑之前,放在接口内部时请求体已经完成解析,自然无法读取到文件内容。
  • 开启tsoa配置的文件上传支持
    找到项目根目录的tsoa.json配置文件,在spec节点下添加multer启用配置:
    {
      "spec": {
        "multer": {
          "enabled": true
        }
      }
    }
    
    修改配置后需要重新运行tsoa命令生成路由和接口文档,配置才会生效。
  • 调整中间件注册顺序
    如果你使用手动注册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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 18:30:03