路由
koa 官方并没有像 express 提供路由原生支持能力,都是三方在做!
最出名莫属于 koa-router,但是目前基本上处于维护瘫痪状态,各种特性、PR、Issue 都基本上没人处理了。还好 koa 社区 fork 并继续维护 改名为 @koa/router。
不用路由
路由本质就是中间件,如果不用路由 我们照样可以手写中间件来处理和响应 用户的请求:
const Koa = require("koa");
const app = new Koa();
const route = (ctx, next) => {
console.log(ctx.path);
switch (ctx.path) {
case "/":
ctx.body = "<h1>欢迎光临index page 页面</h1>";
break;
case "/home":
ctx.body = "<h1>欢迎光临home页面</h1>";
break;
default:
// 404页面
return;
}
};
app.use(route);
app.listen(3001);
但是 这种方式不是很好,当我们项目变得很大的时候,我们需要编写很多 switch-case 这样的语句,代码变得更加耦合,这也是我们为什么推荐使用专业的路由插件的原因了!
import Koa from "koa";
import Router from "@koa/router";
const app = new Koa();
const router = new Router();
router.get("/", (ctx) => {
ctx.body = "Hello World!";
});
router.get("/home", (ctx) => {
ctx.body = "<h1>欢迎光临home页面</h1>";
});
app.use(router.routes()); // 加载路由中间件
app.listen(3001);
路由前缀
嵌套的子路由自动地被继承其了父路由作为它的前缀
const router = new Router({
prefix: '/users'
});
router.get('/', ...); // responds to "/users"
router.get('/:id', ...); // responds to "/users/:id"
获取参数
get
访问 http://localhost:3001/user?id=1
router.get("/user", (ctx) => {
console.log(ctx.query); // {id:1}
});
post
@koa/router 针对 post 请求,参数并不好获取,
需要安装三方插件 @koa/bodyparser
或者 koa-body
(推荐)(express 已经将其内置了,但是 koa 坚持精简)
import Koa from "koa";
import Router from "@koa/router";
import { bodyParser } from "koa-body";
const app = new Koa();
app.use(bodyParser());
const router = new Router();
router.post("/user", (ctx) => {
console.log(ctx.request.body); // {id:1}
});
restfull
访问 http://localhost:3001/user/1
router.get("/user/:id", (ctx) => {
console.log(ctx.params); // {id:1}
});
分割模块
一般情况下,我们会将路由按照功能拆分成不同模块文件,用于我的代码更加的清晰,比如:
router
| --- root.js
| --- user.js
| --- index.js
虽然我手动也能做出模块汇总合并,但是我还是推荐别人造好的轮子来做: koa-combine-routers
router/root.js
import Router from "@koa/router";
const router = new Router();
router.get("/", async (ctx, next) => {
ctx.body = "Hello";
});
export default router;
router/user.js
import Router from "@koa/router";
const router = new Router({ prefix: "/user" });
router.get("/", (ctx) => {
ctx.body = "i am user";
});
export default router;
router/index.js
import userRouter from './user.js'
import rootRouter from './root.js'
import combineRouters from 'koa-combine-routers'
const router = combineRouters(
rootRouter,
userRouter
)
export default router;
最后,我们在 入口文件使用即可
app.js
import Koa from "koa";
import router from './router/index.js'
const app = new Koa();
app.use(router())
app.listen(3001);