@koa/router 分路由
在 Koa2 中使用 @koa/router 进行路由拆分(模块化)是保持项目结构清晰、易于维护的最佳实践。以下是实现分路由的完整步骤和代码示例:
1. 安装依赖
首先确保安装了路由中间件和 body 解析器:
bash
npm install @koa/router koa-bodyparser 2. 创建子路由模块
建议在项目根目录下创建 routes 文件夹,将不同业务模块的路由拆分为独立的文件。
示例:创建 routes/user.js (用户模块)
javascript
const Router = require('@koa/router'); const router = new Router({ prefix: '/users' }); // 可选:设置该模块统一前缀 // 获取所有用户 router.get('/', async (ctx) => { ctx.body = { code: 200, msg: 'success', data: [ { id: 1, name: '张三' }, { id: 2, name: '李四' } ] }; }); // 用户登录 router.post('/login', async (ctx) => { const { username, password } = ctx.request.body; if (username === 'admin' && password === '123456') { ctx.body = { code: 200, msg: '登录成功', token: 'xyz-token' }; } else { ctx.status = 401; ctx.body = { code: 401, msg: '用户名或密码错误' }; } }); module.exports = router; 示例:创建 routes/product.js (商品模块)
javascript
const Router = require('@koa/router'); const router = new Router({ prefix: '/products' }); router.get('/', async (ctx) => { ctx.body = { code: 200, data: [{ id: 101, title: 'iPhone 17' }] }; }); module.exports = router; 3. 在主应用中组装路由
在入口文件(如 app.js 或 index.js)中,引入子路由并使用主路由实例进行挂载。
javascript
const Koa = require('koa'); const Router = require('@koa/router'); const bodyParser = require('koa-bodyparser'); // 引入子路由 const userRoutes = require('./routes/user'); const productRoutes = require('./routes/product'); const app = new Koa(); const router = new Router(); // 注册 body 解析中间件 (处理 POST 请求数据必备) app.use(bodyParser()); // --- 路由组装方式一:直接挂载子路由到主路由 --- // 注意:如果子路由定义了 prefix,这里可以直接 use router.use(userRoutes.routes(), userRoutes.allowedMethods()); router.use(productRoutes.routes(), productRoutes.allowedMethods()); // --- 路由组装方式二:在主路由上指定前缀 --- // 如果子路由没写 prefix,可以在这里统一加前缀 // router.use('/api/v1', userRoutes.routes(), userRoutes.allowedMethods()); // 将主路由注册到 Koa 应用 app.use(router.routes()); app.use(router.allowedMethods()); // 处理 OPTIONS 预检请求等 app.listen(3000, () => { console.log('Server is running on http://localhost:3000'); }); 核心要点说明
-
allowedMethods():务必配合routes()一起使用。它会自动处理 HTTP 方法不允许的情况(例如只定义了 GET 却发了 POST),并自动响应 OPTIONS 预检请求,这对前后端分离项目至关重要。 -
prefix的使用:- 可以在创建子
Router实例时设置prefix(如/users)。 - 也可以在主路由
router.use()时指定前缀(如/api/v1)。 - 两者可以叠加,例如主路由前缀
/api+ 子路由前缀/users= 最终路径/api/users。
- 可以在创建子
-
koa-bodyparser:处理 POST/PUT 请求体时必须引入此中间件,否则ctx.request.body将为undefined。 - 模块化导出:每个子路由文件最后必须通过
module.exports = router导出路由实例,以便主应用引用。
通过这种方式,你可以轻松地将大型应用拆分为用户、订单、商品等多个独立模块,便于团队协作和代码管理。
漫思
浙公网安备 33010602011771号