Routerů pro Koa.js je k dispozici mnoho. Většinu z nich ale nikdo nepoužívá. Při bližším zkoumání přicházejí v úvahu pouze routery dva:
https://github.com/koajs/router
GitHub: 954x Used by, 271 stars, poslední změna kódu před šesti dny. Zazipovaná velikost kódu: 20.6 kB. Založení projektu červen 2019. Aktuálně nejoblíbenější router pro Koa.js. Jde o pokračování původního koa-router, který byl neaktivní. Tento projekt též hledá správce.
// Příklad základního použití
const Koa = require('koa');
const Router = require('@koa/router');
const app = new Koa();
const router = new Router();
router.get('/', (ctx, next) => {
// ctx.router available
});
app
.use(router.routes())
.use(router.allowedMethods());
//---------------------------------------
// get, post, put, del, all
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) => {
// ...
});
//------------------------------------------
// Pojmenované trasy
router.get('user', '/users/:id', (ctx, next) => {
// ...
});
router.url('user', 3);
// => "/users/3"
//------------------------------------------
// multiple midleware
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" }
}
);
//--------------------------------------------
// zahnízděné/vnoření směřovače
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" }
}
);
//---------------------------------------------
// prefixy
const router = new Router({
prefix: '/users'
});
router.get('/', ...); // responds to "/users"
router.get('/:id', ...); // responds to "/users/:id"
//---------------------------------------------
// URL parametry
router.get('/:category/:title', (ctx, next) => {
console.log(ctx.params);
// => { category: 'programming', title: 'how-to-node' }
});
//---------------------------------------------
// middleware
// session middleware will run before authorize
router
.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());
//--------------------------------------------
// Přesměrování
router.redirect('/login', 'sign-in');
// This is equivalent to:
router.all('/login', ctx => {
ctx.redirect('/sign-in');
ctx.status = 301;
});
//---------------------------------------------
// generování URL
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"
//-------------------------------------------
// spustit middleware pro pojmenované trasy
// vhodné např. pro ověřování
router
.param('user', (id, ctx, next) => {
ctx.user = users[id];
if (!ctx.user) return ctx.status = 404;
return next();
})
.get('/users/:user', ctx => {
ctx.body = ctx.user;
})
.get('/users/:user/friends', ctx => {
return ctx.user.getFriends().then(function(friends) {
ctx.body = friends;
});
})
// /users/3 => {"id": 3, "name": "Alex"}
// /users/3/friends => [{"id": 4, "name": "TJ"}]
//---------------------------------------------------
// generování URL z částečné trasy
const url = Router.url('/users/:id', {id: 1});
// => "/users/1"
https://github.com/koajs/route
GitHub: 7300x Used by, 431 stars, poslední změna kódu před více jak rokem. Zazipovaná velikost kódu: 4 kB. Založení projektu prosinec 2013.
// Příklad použití
const _ = require('koa-route');
const Koa = require('koa');
const app = new Koa();
const db = {
tobi: { name: 'tobi', species: 'ferret' },
loki: { name: 'loki', species: 'ferret' },
jane: { name: 'jane', species: 'ferret' }
};
const pets = {
list: (ctx) => {
const names = Object.keys(db);
ctx.body = 'pets: ' + names.join(', ');
},
show: (ctx, name) => {
const pet = db[name];
if (!pet) return ctx.throw('cannot find that pet', 404);
ctx.body = pet.name + ' is a ' + pet.species;
}
};
app.use(_.get('/pets', pets.list));
app.use(_.get('/pets/:name', pets.show));
app.listen(3000);
console.log('listening on port 3000');