@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
相关产品推荐
相关产品推荐

