Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/eggjs/egg-router-plus
The missing router feature for eggjs
https://github.com/eggjs/egg-router-plus
egg egg-plugin egg-router eggjs
Last synced: 4 days ago
JSON representation
The missing router feature for eggjs
- Host: GitHub
- URL: https://github.com/eggjs/egg-router-plus
- Owner: eggjs
- License: mit
- Created: 2017-12-08T16:24:56.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2021-07-12T03:22:09.000Z (over 3 years ago)
- Last Synced: 2024-10-29T21:05:54.181Z (5 days ago)
- Topics: egg, egg-plugin, egg-router, eggjs
- Language: JavaScript
- Homepage:
- Size: 30.3 KB
- Stars: 140
- Watchers: 19
- Forks: 9
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: History.md
- License: LICENSE
Awesome Lists containing this project
- awesome-egg - egg-router-plus - The missing router feature for eggjs ![](https://img.shields.io/github/stars/eggjs/egg-router-plus.svg?style=social&label=Star) ![](https://img.shields.io/npm/dm/egg-router-plus.svg?style=flat-square) (仓库 / 插件)
- awesome-egg - egg-router-plus - The missing router feature for eggjs (Plugins)
README
# egg-router-plus
[![NPM version][npm-image]][npm-url]
[![build status][travis-image]][travis-url]
[![Test coverage][codecov-image]][codecov-url]
[![David deps][david-image]][david-url]
[![Known Vulnerabilities][snyk-image]][snyk-url]
[![npm download][download-image]][download-url][npm-image]: https://img.shields.io/npm/v/egg-router-plus.svg?style=flat-square
[npm-url]: https://npmjs.org/package/egg-router-plus
[travis-image]: https://img.shields.io/travis/eggjs/egg-router-plus.svg?style=flat-square
[travis-url]: https://travis-ci.org/eggjs/egg-router-plus
[codecov-image]: https://img.shields.io/codecov/c/github/eggjs/egg-router-plus.svg?style=flat-square
[codecov-url]: https://codecov.io/github/eggjs/egg-router-plus?branch=master
[david-image]: https://img.shields.io/david/eggjs/egg-router-plus.svg?style=flat-square
[david-url]: https://david-dm.org/eggjs/egg-router-plus
[snyk-image]: https://snyk.io/test/npm/egg-router-plus/badge.svg?style=flat-square
[snyk-url]: https://snyk.io/test/npm/egg-router-plus
[download-image]: https://img.shields.io/npm/dm/egg-router-plus.svg?style=flat-square
[download-url]: https://npmjs.org/package/egg-router-plusThe missing router features for [eggjs](https://eggjs.org)
## Install
```bash
$ npm i egg-router-plus --save
```Then mount plugin:
```js
// {app_root}/config/plugin.js
exports.routerPlus = {
enable: true,
package: 'egg-router-plus',
};
```## Features
### load `app/router/**/*.js`
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
```js
app.router.namespace(prefix, ...middlewares);
```- `prefix` - {String}, the prefix string of sub router
- `middlewares` - {...Function}, optional group middlewaresSupport 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 '/'.
```js
// {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.
```js
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
};
```## Known issues
- sub `redirect` is not support, use `app.router.redirect()` or redirect to a named router.
```js
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');
```## Questions & Suggestions
Please open an issue [here](https://github.com/eggjs/egg/issues).
## License
[MIT](LICENSE)