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

@koa/router Router实例use方法用法解析及404问题排查

问题解决与Router.use详解

为什么会返回404?

你写的代码里创建了Router实例,但没有把路由中间件注册到Koa应用中。Koa不会自动识别你定义的路由,必须显式调用app.use(router.routes())和app.use(router.allowedMethods())来启用路由功能。

Router.use的具体用途

router.use()的核心作用是给指定前缀的路由路径绑定中间件,核心特点包括:

  • 仅当请求路径匹配该前缀时,挂载的中间件才会执行
  • 支持挂载任意Koa中间件,包括自定义函数、第三方中间件都可以
  • 可以挂载其他Router实例,实现路由嵌套,适合拆分复杂的路由结构
  • 中间件按挂载顺序依次执行,调用next()会将请求传递到下一个中间件

实现所有/api开头的请求转发到自定义中间件

下面是两种常见实现方式:

方式1:挂载普通自定义中间件

import Koa from 'koa';
import Router from '@koa/router';

const app = new Koa();
const router = new Router();

// 给所有/api开头的请求绑定自定义中间件
router.use('/api', (ctx, next) => {
  ctx.body = 'catch all with use';
  ctx.status = 201;
  // 若后续有其他中间件需要执行则调用next(),无需传递可省略
  // next();
});

// 必须注册路由中间件到Koa应用
app.use(router.routes());
// 处理OPTIONS请求与不允许的HTTP方法响应
app.use(router.allowedMethods());

app.listen(3000);

现在访问http://localhost:3000/api或http://localhost:3000/api/xxx都会触发该中间件。

方式2:挂载子路由(适合/api下有多个细分路径的场景)

如果/api下还有更具体的接口,可以创建子Router拆分路由:

import Koa from 'koa';
import Router from '@koa/router';

const app = new Koa();
const mainRouter = new Router();
// 创建/api的子路由实例
const apiRouter = new Router({ prefix: '/api' });

// 给子路由添加具体接口
apiRouter.get('/users', (ctx) => {
  ctx.body = 'API: Get users list';
});
apiRouter.post('/users', (ctx) => {
  ctx.body = 'API: Create user';
});

// 将子路由挂载到主路由的/api前缀下
mainRouter.use('/api', apiRouter.routes(), apiRouter.allowedMethods());

// 注册主路由到Koa应用
app.use(mainRouter.routes());
app.use(mainRouter.allowedMethods());

app.listen(3000);

这种方式既实现了/api前缀的统一拦截,又保留了路由细分的灵活性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:30:07