Skip to content

Router Module For Nestjs Framework ๐Ÿšฆ ๐Ÿš€

License

Notifications You must be signed in to change notification settings

nestjsx/nest-router

Repository files navigation

Nest Router ๐Ÿšฆ

Greenkeeper badge Build Status npm version Coverage Status FOSSA Status

Router Module For Nestjs Framework

Important Note

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).

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.

FOSSA Status