Modular Koa router middleware with Express-style routes and middleware mounting.
npm install kroute --save
Kroute exports a function which can be used to create router instances that work with Koa middleware.
varkoa=require('koa')varkroute=require('kroute')varapp=koa()varrouter=kroute()app.use(router)A router can be initialized with default handlers based on a resourceful routing object.
router({use: authorizeUser(),index: function*(){},create: [function*(){},function*(){}]})Actions are mapped as follows:
GET / -> index
GET /new -> new
POST / -> create
GET /:id -> show
GET /:id/edit -> edit
PUT /:id -> update
DELETE /:id -> destroy
The object can also contain a use property which is mounted before any routes.
Every router instance can used to attach request handlers.
router.get('/user',function*(){})Omitting the path name will ensure the handler is always executed when the method matches.
router.post(function*(){})Every route method accepts multiple middleware handlers.
router.delete(authorizeUser(),function*(){})Every router provides a .all method for attaching request handlers to every method.
router.all(function*(){})It accepts a path and multiple middleware like any other method.
router.all('/',authorizeUser(),function*(){})Every router comes with the ability to mount middleware and handlers.
varmount=kroute()router.use('/users',mount)As long as the middleware follows the Koa generator pattern, it can be mounted.
router.use('/users',function*(next){console.log(this.url)//=> "/123" -> Stripped the route prefix.yieldnext})Like other methods, .use also accepts multiple request handlers and an optional path.
router.use(authorizeUser(),function*(){})Every path can be dynamic and use Express-style parameter notation.
router.get('/:user',function*(){console.log(this.params.user)//=> "123"})Every match is stored in the params as an object.
router.get('/:foo/:bar',function*(){console.log(this.params)//=> { foo: "123", bar: "456" }})The route can also be a regular expression.
router.get(/^\/blog\/(\d{4})-(\d{2})-(\d{2})\/?$/i,function*(next){console.log(this.params)// => { 0: '2014', 1: '03', 2: '17' }})Every method returns it's own instance, so routes can be chained together like Express.
router.get('/foo',function*(){}).post('/bar',function*(){})Every method accepts an options object as the last argument.
router.get('/foo',function*(){},{strict: true,sensitive: true})MIT