nestjsx / Nest Router
Programming Languages
Projects that are alternatives of or similar to Nest Router
Nest Router đŚ
Router Module For Nestjs Framework
Quick Overview
RouterModule
helps you organize your routes and lets you create a routes tree.
How ?
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 .
Install
IMPORTANT: you need Nest > v4.5.10+
npm install nest-router --save
OR
yarn add nest-router
Setup
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.
Example Folder Project Structure
.
âââ 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!
Params in nested routes
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.
Resolve Full Controller Path:
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.
CHANGELOG
See CHANGELOG for more information.
Contributing
You are welcome to contribute to this project, just open a PR.
Authors
- Shady Khalifa - Initial work
See also the list of contributors who participated in this project.
License
This project is licensed under the MIT License - see the LICENSE.md file for details.