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

Koa-body无法获取request.files,TypeScript类型报错求助

问题解决

核心问题分析

你同时使用了koa-body和@koa/multer两个处理multipart请求的中间件,两者功能重叠导致冲突;另外TypeScript默认类型定义中不包含ctx.request.files/ctx.files/ctx.request.file/ctx.file这些属性,因此抛出类型错误。

方案一:仅用koa-body处理文件上传(推荐)

koa-body内置formidable,原生支持文件上传,无需额外引入multer。

步骤1:移除@koa/multer相关代码

删除以下代码块:

import * as multer from '@koa/multer';
const upload = multer();

步骤2:调整路由处理逻辑

koa-body处理后,文件会挂载在ctx.request.files下,修改上传路由:

// 多文件上传
router.post('/upload-multiple-files', ctx => {
  console.log('ctx.request.files', ctx.request.files);
  console.log('ctx.request.body', ctx.request.body);
  ctx.body = 'done';
});

// 单文件上传
router.post('/upload-single-file', ctx => {
  // 单文件场景下,ctx.request.files为对应字段名的文件对象
  console.log('ctx.request.files', ctx.request.files);
  console.log('ctx.request.body', ctx.request.body);
  ctx.body = 'done';
});

步骤3:扩展TypeScript类型

在项目src目录下创建types/koa-body.d.ts文件,添加类型声明:

declare module 'koa' {
  interface Request {
    files?: {
      [key: string]: any; // 如需更精确类型,可引入formidable的File类型:import { File } from 'formidable',替换为File | File[]
    };
  }
}

declare module '@koa/router' {
  interface ParameterizedContext {
    files?: {
      [key: string]: any;
    };
  }
}

这样TypeScript就能识别ctx.request.files等属性。

方案二:仅用@koa/multer处理文件上传

若偏好使用multer,需关闭koa-body的multipart支持。

步骤1:修改koa-body配置

将multipart设为false,让multer接管文件上传:

app.use(
  koaBody({
    multipart: false, // 关闭koa-body的multipart处理
    formidable: {
      uploadDir: "src/misc/temp",
      keepExtensions: true,
    },
  })
);

步骤2:修复multer使用错误

upload.single()必须传入表单字段名,否则会抛出异常:

// 单文件上传路由修正
router.post(
  '/upload-single-file',
  upload.single('avatar'), // 指定表单中文件字段的名称
  ctx => {
    console.log('ctx.request.file', ctx.request.file);
    console.log('ctx.request.body', ctx.request.body);
    ctx.body = 'done';
  }
);

步骤3:扩展TypeScript类型

创建types/koa-multer.d.ts文件:

import { File } from '@koa/multer';

declare module 'koa' {
  interface Request {
    file?: File;
    files?: { [key: string]: File[] };
  }
}

declare module '@koa/router' {
  interface ParameterizedContext {
    file?: File;
    files?: { [key: string]: File[] };
  }
}

额外注意事项

  • 确保src/misc/temp目录已存在,否则formidable会因无法写入文件报错
  • 测试时使用Postman或curl发送multipart/form-data类型请求,需与路由中指定的字段名匹配

内容的提问来源于stack exchange,提问作者Duca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:58:26