koa-map-router v0.0.3
koa-map-router
A router for koa that's almost too simple.
Install
npm install --save koa-map-router
Usage
var app = require('koa')();
var Router = require('koa-map-router');
var router1 = new Router();
router1.get('/user', [loadUser, showUser]);
router1.put('/user', [loadUser, updateUser]);
router1.del('/user', [loadUser, deleteUser]);
app.use(router1.middleware());
var router2 = new Router();
router2.get('/hello/world', [function*() { this.body = ':)'; }]);
app.use(router2.middleware());
app.listen(3000);
How it works
For fast and simple lookup, routes are stored in a Map of path
to a Map of method
to a (composed) array of middleware generator functions.
The example in the "Usage" section creates these maps:
var router1 = {
'/user': {
'GET': [loadUser, showUser],
'PUT': [loadUser, updateUser],
'DELETE': [loadUser, deleteUser]
}
};
var router2 = {
'/hello/world': {
'GET': [function*() { this.body = ':)'; }]
}
};
The library offers a simple API on top of its underlying maps:
This:
router.get('/user', [loadUser, showUser]);
is sugar for:
router.addRoute('GET', '/user', [loadUser, showUser]);
which is sugar for:
router.routes.get('/user').set('GET', compose([loadUser, showUser]));
When a request comes in, it's pretty much matched like routes[this.path][this.method]
, though it's not exactly like that. For instance, an incoming HEAD request will match if you have a GET defined for the requested path.
What about wildcard, parameterized, globbing, or regexp routing?
This router does not support the sort of syntax you may be used to like:
router.get('/users/:id', ...)
router.get(/^users\/(\d+)$/, ...)
Instead, you could implement GET /users?id=1
(depend on query-params)
Or you can even pre-generate all of your routes:
var router = new Router();
var users = yield db.findAllUsers();
users.forEach(function(user) {
router.get('/users/' + user.id, [loadUser, showUser]);
});
The tradeoff is that routing is constant time and the code is dead simple.