koa-router可以很方便的写出路由跳转的代码。
安装koa cnpm install koa --save
安装koa-router cnpm install koa-router --save
放个api文档,不过我有一点补充鉴权的部分。
https://github.com/ZijianHe/koa-router
简单示例
我们先写一个get请求,
"use strict"
const Koa = require("koa");
const Router=require("koa-router");
const app = new Koa();
const router=new Router();
router.get('/',(ctx)=>{
ctx.body="主页";
})
app.use(router.routes());//将中间件加入app中
app.listen(3000);
使用postman验证api
使用前缀
比如像这段代码,在创建router时就可以带上前缀
var router = new Router({
prefix: '/users'
});
router.get('/', ...); // responds to "/users"
router.get('/:id', ...); // responds to "/users/:id"
获取URL参数
router的参数存放在ctx.params中
router.get('/:category/:title', (ctx, next) => {
console.log(ctx.params);
// => { category: 'programming', title: 'how-to-node' }
});
实际举一个例子
"use strict"
const Koa = require("koa");
const Router=require("koa-router");
const app = new Koa();
const router=new Router();
router.get('/',(ctx)=>{
ctx.body="主页";
})
router.get('/users/:id',(ctx)=>{
ctx.body=`${ctx.params.id}`; //这个id就是上面冒号后id的内容
})
app.use(router.routes());
app.listen(3000)c
多级嵌套时,直接在参数中写我们需要的值就可以取出
鉴权
这里举个简单的例子,鉴权可以用于过滤掉一些不合法的请求,首先写一个函数。当不符合时返回401.
const auth = async (ctx, next) => {
if (ctx.url !== `/users`) {
ctx.throw(401).catch();
}
await next();
}
注意,这时url必须为http://localhost:3000/users。
usersRouter.get('/:id', auth, (ctx) => {
ctx.body = `${ctx.params.id}`;
})
usersRouter.get(`/`,auth,(ctx)=>{
ctx.body="users"
})
访问其它链接即为无效
如果想访问动态链接,可以使用正则表达式
const auth = async (ctx, next) => {
if (ctx.url !== ctx.url.match(/\/users\/\d+/).toString()) {
ctx.throw(401).catch();
}
await next();
}
这里我写了几个常用的方法,注意delete方法约定返回的状态码是204
其它方法可以去上面给的链接里找到
模拟请求演示
这里我使用数组模拟数据库请求。
使用koa-body-parser模块来获取post中request的body。
"use strict"
const Koa = require("koa");
const Router = require("koa-router");
const bodyparser=require("koa-body-parser");
const app = new Koa();
const router = new Router();
const usersRouter = new Router({prefix: `/users`})
let db=[];
router.get('/', (ctx) => {
ctx.body = "主页";
});
usersRouter.get('/:id', (ctx) => {
ctx.body = db[+ctx.params.id];
})
usersRouter.post(`/`,(ctx)=>{
db.push(ctx.request.body);
ctx.body=ctx.request.body;//request的body
})
usersRouter.put(`/:id`,(ctx)=>{
db[ctx.params.id]=ctx.request.body;
ctx.status=200;
})
usersRouter.delete(`/:id`,(ctx)=>{
db.splice(+ctx.params.id,1);
ctx.status=204;
})
app.use(router.routes());
app.use(bodyparser());
app.use(usersRouter.routes());
app.use(usersRouter.allowedMethods());
app.listen(3000)
这里直接可以使用postman进行相应的请求方法测试。