koa2学习笔记:koa-router使用方法及多路由代码组织
在koa2中我们可以通过中间件koa-router来组织我们的路由
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
// 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
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"
点赞(0)