The missing router features for eggjs
$ npm i egg-router-plus --save
Then mount plugin:
// {app_root}/config/plugin.js
exports.routerPlus = {
enable: true,
package: 'egg-router-plus',
};
this plugin will auto load router define at app/router/**/*.js
.
Notice: all sub routers will be loaded before app/router.js
, please ensure all the sub router definitions are not conflict(better to use app.router.namespace
to create different namespaces for each sub router file).
app.router.namespace(prefix, ...middlewares);
prefix
- {String}, the prefix string of sub routermiddlewares
- {...Function}, optional group middlewares
Support same as Router:
router.verb('path-match', app.controller.action);
router.verb('path-match', middleware1, ..., middlewareN, app.controller.action);
router.verb('router-name', 'path-match', app.controller.action);
router.verb('router-name', 'path-match', middleware1, ..., middlewareN, app.controller.action);
prefix
and path
are not allow to be regex
, and prefix
can't be '/'.
// {app_root}/app/router.js
module.exports = app => {
const subRouter = app.router.namespace('/sub');
// curl localhost:7001/sub/test
subRouter.get('/test', app.controller.sub.test);
subRouter.get('sub_upload', '/upload', app.controller.sub.upload);
// const subRouter = app.router.namespace('/sub/:id');
// const subRouter = app.router.namespace('/sub', app.middleware.jsonp());
// output: /sub/upload
console.log(app.url('sub_upload'));
};
Every different prefix will bind to different router instance, and all the namespaces will sort by trie tree to ensure best match.
module.exports = app => {
const apiRouter = app.router.namespace('/api');
const apiWebRouter = app.router.namespace('/api/web');
const apiWebAdminRouter = app.router.namespace('/api/web/admin');
apiRouter.get('/:a/:b/:c', controller.api.one);
apiWebRouter.get('/:a/:b', controller.api.two);
apiWebAdminRouter.get('/:a', controller.api.three);
// /api/web/admin/hello => controller.api.three
// /api/web/foo/hello => controller.api.two
// /api/foo/bar/hello => controller.api.one
};
- sub
redirect
is not support, useapp.router.redirect()
or redirect to a named router.
const subRouter = app.router.namespace('/sub');
// will redirect `/sub/go` to `/anyway`, not `/sub/anyway`
subRouter.redirect('/go', '/anyway');
// just use router
router.redirect('/sub/go', '/sub/anyway');
// or redirect to a named router
subRouter.get('name_router', '/anyway', app.controller.sub.anyway);
// will redirect `/sub/go_name` to `/sub/anyway` which is named `name_router`
subRouter.redirect('/sub/go_name', 'name_router');
Please open an issue here.