Simple and fast router for koa 2.x
- support prefix
- support auto OPTIONS and 405 response
- use
path-to-regexp
to parse url - use express style routing (
.get
,.put
,.post
,.all
, etc ) - use loop to iterate through multiple routes instead of recursive calls
- better performance
- prevent max call stack error with large number of routes
$ npm install koa-simple-router
const Koa = require('koa') // koa 2.x
const router = require('koa-simple-router')
let app = new Koa()
app.use(router(_ => {
_.get('/', (ctx, next) => {
ctx.body = 'hello'
})
_.post('/name/:id', (ctx, next) => {
// ...
})
})
Create a router middleware with init function.
const Koa = require('koa')
const router = require('koa-simple-router')
const app = new Koa()
app.use(router(_ => {
_.get('/', (ctx, next) => {
})
_.post('/path', (ctx, next) => {
})
}))
Create a router middleware with options and init function.
Default options is the same as path-to-regexp
.
- prefix (default:
null
) - sensitive (default:
false
) - strict (default:
false
) - end (default:
true
)
const Koa = require('koa')
const router = require('koa-simple-router')
const app = new Koa()
app.use(router({ prefix: '/api' }, _ => {
_.get('/:user/id', (ctx, next) => {
})
_.post('/:user/id', (ctx, next) => {
})
}))
app.use(router(_ => {
_.get('/path',
(ctx, next) => {},
(ctx, next) => {},
(ctx, next) => {}
)
}))
Middleware mode: works just like _.verb(path, ...mw)
but ignore ctx.method
app.use(router(_ => {
_.all('/path/to/:recource', (ctx, next) => {
})
}))
Object mode: accept an object with method as key and middleware or array of middleware as value
- auto
HEAD
response ifGET
present - auto
OPTIONS
response withAllow
header - auto 405 response with
Allow
header
app.use(router(_ => {
_.all('/path/to/:recource', {
get: (ctx, next) => {
// ...
},
post: (ctx, next) => {
// ...
},
put: (ctx, next) => {
// ...
},
delete: (ctx, next) => {
// ...
}
// Allow: GET, HEAD, POST, PUT, DELETE, OPTIONS
})
}))
which is equivalent to
app.use(router(_ => {
_.all('/path/to/:recource', (ctx, next) => {
switch (ctx.method) {
case 'GET':
case 'HEAD':
// ...
break
case 'POST':
// ...
break
case 'PUT':
// ...
break
case 'DELETE':
// ...
break
case 'OPTIONS':
ctx.status = 200
ctx.set('Allow', 'GET, HEAD, POST, PUT, DELETE, OPTIONS')
break
default:
ctx.status = 405 // method not allowed
ctx.set('Allow', 'GET, HEAD, POST, PUT, DELETE, OPTIONS')
}
}
}))
Register middleware for named route parameters.
app.use(router(_ => {
_.param('user', async (ctx, next) => {
ctx.user = await User.find(ctx.params.user)
// ...
return next()
})
_.get('/:user/do-x', (ctx, next) => {
})
_.post('/:user/do-y', (ctx, next) => {
})
}))
MIT