Creating a Custom NestJS Module

@rnab
3 min readFeb 8, 2025

--

NestJS is a progressive Node.js framework built on top of Express, designed to help developers build efficient and scalable server-side applications. One of the core concepts of NestJS is the module, which fosters a modular architecture by organizing the application into cohesive and reusable parts.

Creating a custom NestJS module can significantly enhance the modularity and maintainability of your application. In this article, we will guide you through the process of creating a custom NestJS module using TypeScript, and explain the best practices along the way.

Understanding NestJS Modules

Before diving into creating a custom module, it’s important to understand what a module is in NestJS. A module is a class annotated with a @Module() decorator that bundles components such as providers, controllers, and exports a specific set of functionalities.

Why Use Modules?

  • Encapsulation: Group related components together.
  • Reusability: Share and reuse code easily across the application.
  • Maintainability: Simplifies the structure of the application, making it easier to manage.

Setting up a NestJS Project

First, make sure you have the NestJS CLI installed:

npm install -g @nestjs/cli

Create a new NestJS project:

nest new my-nest-project

Navigate into the project directory:

cd my-nest-project

Creating a Custom Module

Here’s a step-by-step guide to creating a custom module in a NestJS application. In this example, we’ll create a ProductsModule for managing products in an e-commerce application.

Step 1: Generate the Module

Use the NestJS CLI to generate a new module:

nest generate module products

This command will create a new directory under src named products with a products.module.ts file.

Step 2: Define the Product Entity

Define a Product interface to represent a product entity:

// src/products/product.interface.ts
export interface Product {
id: number;
name: string;
price: number;
description: string;
}

Step 3: Create a Service

Create a service to handle business logic related to products:

nest generate service products

Edit the products.service.ts to implement some basic product management methods:

// src/products/products.service.ts
import { Injectable } from '@nestjs/common';
import { Product } from './product.interface';

@Injectable()
export class ProductsService {
private readonly products: Product[] = [];

findAll(): Product[] {
return this.products;
}

findOne(id: number): Product | undefined {
return this.products.find(product => product.id === id);
}

create(product: Product) {
this.products.push(product);
}
}

Step 4: Create a Controller

Generate a controller to handle HTTP requests:

nest generate controller products

Implement the controller to provide basic CRUD operations:

// src/products/products.controller.ts
import { Controller, Get, Post, Body, Param } from '@nestjs/common';
import { ProductsService } from './products.service';
import { Product } from './product.interface';

@Controller('products')
export class ProductsController {
constructor(private readonly productsService: ProductsService) {}

@Get()
findAll(): Product[] {
return this.productsService.findAll();
}

@Get(':id')
findOne(@Param('id') id: string): Product {
return this.productsService.findOne(+id);
}

@Post()
create(@Body() product: Product) {
this.productsService.create(product);
}
}

Step 5: Update the Module

Now, let’s register the service and controller with the module:

// src/products/products.module.ts
import { Module } from '@nestjs/common';
import { ProductsService } from './products.service';
import { ProductsController } from './products.controller';

@Module({
providers: [ProductsService],
controllers: [ProductsController],
})
export class ProductsModule {}

Step 6: Integrate the Module

Finally, integrate the newly created ProductsModule into the main application module:

// src/app.module.ts
import { Module } from '@nestjs/common';
import { ProductsModule } from './products/products.module';

@Module({
imports: [ProductsModule],
})
export class AppModule {}

Testing Your Module

Now, you can run your NestJS application using the following command:

npm run start

Open your browser and navigate to http://localhost:3000/products to see the list of products. You can also use HTTP clients like Postman or Insomnia to interact with your API, performing operations like GET and POST.

Conclusion

Creating a custom module in NestJS is straightforward and immensely helpful in managing applications as they grow in complexity. Modules encapsulate related components, ensuring maintainability and scalability. By following this guide, you have not only learned how to create a custom module but also established a foundation for building modular and efficient NestJS applications.

Happy Coding! Feel free to explore more about NestJS and enjoy its powerful features to enhance your backend applications.

--

--

@rnab
@rnab

Written by @rnab

Typescript, Devops, Kubernetes, AWS, AI/ML, Algo Trading

No responses yet