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

Strapi+TypeScript中Middleware与Controller的ctx参数类型及报错问题

Strapi + TypeScript:中间件/控制器ctx参数的正确类型指定

你遇到的问题根源是用了Koa原生的Context类型,而Strapi对Koa的Context做了扩展,添加了badRequest、notFound等自定义响应方法,这些方法的类型定义并不在Koa的类型包中,所以TypeScript会报错。

正确的做法是导入Strapi官方提供的Context类型:

1. 导入Strapi的Context类型

直接从@strapi/strapi包中导入Context,这个类型包含了Strapi对Koa Context的所有扩展:

import { Context } from '@strapi/strapi';

2. 修正中间件代码

把你的中间件代码中的ctx类型替换为Strapi的Context,同时可以优化next参数的类型(用Promise<void>替代Promise<any>更严谨):

// path: ./src/api/[api-name]/middlewares/my-middleware.ts
import { Context } from '@strapi/strapi';

export default async (ctx: Context, next: () => Promise<void>) => {
  const newName = ctx.request.body.name;
  if (!newName) {
    // 现在TypeScript会正确识别badRequest的多参数签名
    return ctx.badRequest('name is missing', { foo: 'bar' });
  }
  await next();
};

3. 控制器中的ctx类型

控制器里的ctx参数同样使用这个Context类型,示例如下:

// path: ./src/api/[api-name]/controllers/[api-name].ts
import { Context } from '@strapi/strapi';

export default {
  async find(ctx: Context) {
    ctx.body = await strapi.service('api::[api-name].[api-name]').find();
  },

  async create(ctx: Context) {
    const data = ctx.request.body;
    // 可以正常使用ctx.badRequest等Strapi扩展方法
    if (!data.title) {
      return ctx.badRequest('Title is required');
    }
    ctx.body = await strapi.service('api::[api-name].[api-name]').create({ data });
  },
};

为什么Koa的Context不行?

Strapi在底层基于Koa开发,但对Koa的Context做了大量扩展,比如:

  • 自定义响应方法:badRequest、notFound、forbidden等,这些方法支持额外的参数(比如错误详情对象)
  • 附加属性:strapi实例、state扩展等
    Koa原生的Context类型并没有包含这些扩展定义,所以TypeScript无法识别,进而抛出参数不匹配的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:07:23