koa2学习笔记:koa-router使用方法及多路由代码组织

蛰伏已久 2019-09-04

在koa2中我们可以通过中间件koa-router来组织我们的路由

安装koa2

npm install koa-router


路由配置方法

可以配置router.get|put|post|patch|delete|del等method,记得通过app.use添加路由中间件

var Koa = require('koa');
var Router = require('koa-router');

var app = new Koa();
var router = new Router();



router.get('/',(ctx,next)=>{
    ctx.body = 'index'
})

router.post('/user',(ctx,next)=>{
    ctx.body = 'post user'
})

app.use(router.routes()).use(router.allowedMethods())



app.listen(3031)

还可以通过链式设置,可以通过all设置全部method

router
  .get('/', (ctx, next) => {    ctx.body = 'Hello World!';
  })
  .post('/users', (ctx, next) => {    // ...
  })
  .put('/users/:id', (ctx, next) => {    // ...
  })
  .del('/users/:id', (ctx, next) => {    // ...
  })
  .all('/users/:id', (ctx, next) => {    // ...
  });

router还可以命名

router.get('user', '/users/:id', (ctx, next) => { 
// ...
});
router.url('user', 3);
// => "/users/3"

多重中间件

router.get(
    '/users/:id',
    (ctx, next) => {
        return User.findOne(ctx.params.id).then(function(user) {
            ctx.user = user;
            next();
        });
    },
    ctx => {
        console.log(ctx.user);
        // => { id: 17, name: "Alex" }
    }
);

嵌套路由

比如我们要实现 /user/list 和 /user/:id,公共部分都是/user,可以提取出来,通过嵌套路由方式实现。

嵌套路由可以理解为将主路由和子路由合并,如下主路由为'/user',子路由为'/list'和'/:id',可以响应 '/user/list'和'/user/:id'

const Koa = require('koa')
const app = new Koa()

const Router = require('koa-router')


var forums = new Router();
var posts = new Router();

posts.get('/list', (ctx, next) => {
    ctx.body = 'user list'
});
posts.get('/:id', (ctx, next) => {
    ctx.body = 'user detail'
});

forums.use('/user', posts.routes(), posts.allowedMethods());

app.use(forums.routes());
app.listen(3031)

路由前缀

我们也可以给路由设置一个前缀,实现的效果和嵌套路由类似,区别是路由前缀是个固定字符串,不能传递动态参数

var router = new Router({
    prefix: '/users'
});

router.get('/', ...); // responds to "/users"
router.get('/:id', ...); // responds to "/users/:id"

也可以通过router.prefix设置

router.prefix('/things/:thing_id')



获取路由参数

可通过ctx.params获取路由中的参数对象,而url中?后面的参数,则可以通过ctx.query对象获取

router.get('/:category/:title', (ctx, next) => {
    console.log(ctx.params);
    // => { category: 'programming', title: 'how-to-node' }
});


添加中间件

koa-router也支持添加中间件

router.use([path], middleware) ⇒ Router

// session middleware will run before authorizerouter
  .use(session())
  .use(authorize());
  // use middleware only with given path
  router.use('/users', userAuth());
  // or with an array of paths
  router.use(['/users', '/admin'], userAuth());
  app.use(router.routes());


重定向

router.redirect('/login', 'sign-in');

等价于

router.all('/login', ctx => {
    ctx.redirect('/sign-in');
    ctx.status = 301;
});

生成路由url

router.url(name, params, [options]) ⇒ String | Error

router.get('user', '/users/:id', (ctx, next) => {
    // ...
});

router.url('user', 3);
// => "/users/3"

router.url('user', { id: 3 });
// => "/users/3"

router.use((ctx, next) => {
    // redirect to named route
    ctx.redirect(ctx.router.url('sign-in'));
})

router.url('user', { id: 3 }, { query: { limit: 1 } });
// => "/users/3?limit=1"

router.url('user', { id: 3 }, { query: "limit=1" });
// => "/users/3?limit=1"



-END-

点赞(0)