koa-router

koa-router可以很方便的写出路由跳转的代码。

安装koa                   cnpm install koa --save 

安装koa-router         cnpm install koa-router --save

放个api文档,不过我有一点补充鉴权的部分。

https://github.com/ZijianHe/koa-router

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进行相应的请求方法测试。

发表评论