Greenkeeper badge Build Status npm version Coverage Status FOSSA Status
Router Module For Nestjs Framework
As of Nestjs v8.0.0
This module got added into the @nestjs/core
.
see the docs
with that being said, this package is still maintained (for now).
RouterModule
helps you organize your routes and lets you create a routes tree.
Every module could have a path property. That path will be a prefix for all controllers in this module. If that module has a parent, it will be a child of it and again all controllers in this child module will be prefixed by parent module prefix
+ this module prefix
see issue #255 .
IMPORTANT: you need Nest > v4.5.10+
npm install nest-router --save
OR
yarn add nest-router
See how easy it is to set up.
... //imports const routes: Routes = [ { path: '/ninja', module: NinjaModule, children: [ { path: '/cats', module: CatsModule, }, { path: '/dogs', module: DogsModule, }, ], }, ]; @Module({ imports: [ RouterModule.forRoutes(routes), // setup the routes CatsModule, DogsModule, NinjaModule ], // as usual, nothing new }) export class ApplicationModule {}
๐ TIP: Keep all of your routes in a separate file like
routes.ts
In this example, all the controllers in NinjaModule
will be prefixed by /ninja
and it
has two childs, CatsModule
and DogsModule
.
Will the controllers of CatsModule
be prefixed by /cats
? NO!! ๐ฎ
The CatsModule
is a child of NinjaModule
so it will be prefixed by /ninja/cats/
instead.
And so will DogsModule
.
See examples folder for more information.
.
โโโ app.module.ts
โโโ cats
โ โโโ cats.controller.ts
โ โโโ cats.module.ts
โ โโโ ketty.controller.ts
โโโ dogs
โ โโโ dogs.controller.ts
โ โโโ dogs.module.ts
โ โโโ puppy.controller.ts
โโโ main.ts
โโโ ninja
โโโ katana.controller.ts
โโโ ninja.controller.ts
โโโ ninja.module.ts
And here is a simple, nice route tree of example
folder:
ninja โโโ / โโโ /katana โโโ cats โ โโโ / โ โโโ /ketty โโโ dogs โโโ / โโโ /puppy
Nice!
In a standard REST API, you probably would need to add some params to your nested routes. Here is an example of how you can achieve it:
... //imports const routes: Routes = [ { path: '/ninja', module: NinjaModule, children: [ { path: '/:ninjaId/cats', module: CatsModule, }, { path: '/:ninjaId/dogs', module: DogsModule, }, ], }, ];
The ninjaId
param will be available inside CatsModule
controllers and DogsModule
controllers. Please, find the instruction how to handle params in the official documentation. It might be a good practice to use a pipe for transformation use case to have an access to ninja
object instead of just id.
Nestjs dosen't resolve or take into account MODULE_PATH
metadata when it is coming to resolve Controller path in Middleware resolver for example, so that i introduced a new fancy method RouterModule#resolvePath
that will resolve the full path of any controller so instead of doing so:
consumer.apply(someMiddleware).forRoutes(SomeController);
you should do
consumer.apply(someMiddleware).forRoutes(RouterModule.resolvePath(SomeController));
see #32 for more information about this.
See CHANGELOG for more information.
You are welcome to contribute to this project, just open a PR.
- Shady Khalifa - Initial work
See also the list of contributors who participated in this project.
This project is licensed under the MIT License - see the LICENSE.md file for details.