Building a Blogging Platform with NestJS: A Step-by-Step Guide

@rnab
3 min readFeb 6, 2025

--

In the world of web development, blogging platforms remain a popular project for both learning and production purposes. They involve a multitude of features, from content management to user authentication, which provide a broad spectrum of learning opportunities. In this article, we’ll look at how to build a basic blogging platform using NestJS, a powerful Node.js framework known for its scalability and maintainability.

Why NestJS?

NestJS is a progressive Node.js framework that helps developers build efficient and scalable server-side applications. It is built on top of Express (or optionally, Fastify), and is heavily inspired by Angular, utilizing TypeScript for development and offering a modular architecture that is ideal for building robust backends.

Prerequisites

Before we dive into building our blogging platform, make sure you have the following installed:

  • Node.js (v12.x or higher)
  • npm (comes with Node.js)
  • NestJS CLI (npm install -g @nestjs/cli)
  • An IDE or Text Editor (e.g., Visual Studio Code)

Getting Started

To kick things off, let’s create a new NestJS project:

nest new blogging-platform
cd blogging-platform

Nest will set up a new project with a default structure that includes several starter files.

Setting Up the Blog Module

NestJS follows a modular architecture. A module is a single cohesive part of the application with similar functionalities. For our blogging platform, let’s set up a BlogModule:

nest generate module blog

Now, generate the corresponding controller and service:

nest generate controller blog
nest generate service blog

This will create blog.controller.ts and blog.service.ts files. These files will handle the logic for our blog functionalities.

Implementing the Blog Service

In blog.service.ts, we will define basic CRUD operations for manipulating blog posts. For simplicity, let's store our blog posts in memory as an array of objects.

import { Injectable } from '@nestjs/common';

interface BlogPost {
id: number;
title: string;
content: string;
}

@Injectable()
export class BlogService {
private readonly blogPosts: BlogPost[] = [];

create(blogPost: BlogPost) {
this.blogPosts.push(blogPost);
}

findAll(): BlogPost[] {
return this.blogPosts;
}

findOne(id: number): BlogPost | undefined {
return this.blogPosts.find(post => post.id === id);
}

update(id: number, updatedPost: Partial<BlogPost>) {
const postIndex = this.blogPosts.findIndex(post => post.id === id);
if (postIndex !== -1) {
this.blogPosts[postIndex] = { ...this.blogPosts[postIndex], ...updatedPost };
}
}

remove(id: number) {
const postIndex = this.blogPosts.findIndex(post => post.id === id);
if (postIndex !== -1) {
this.blogPosts.splice(postIndex, 1);
}
}
}

Creating a Blog Controller

Next, handle the HTTP requests in blog.controller.ts by utilizing the service we just created:

import { Controller, Get, Post, Body, Param, Put, Delete } from '@nestjs/common';
import { BlogService } from './blog.service';

@Controller('blog')
export class BlogController {
constructor(private readonly blogService: BlogService) {}

@Post()
create(@Body() blogPost: { id: number; title: string; content: string }) {
this.blogService.create(blogPost);
}

@Get()
findAll() {
return this.blogService.findAll();
}

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

@Put(':id')
update(@Param('id') id: string, @Body() updatedPost: Partial<{ title: string; content: string }>) {
this.blogService.update(+id, updatedPost);
}

@Delete(':id')
remove(@Param('id') id: string) {
this.blogService.remove(+id);
}
}

Registering the Blog Module

The last step is to register our BlogModule in the main application module app.module.ts:

import { Module } from '@nestjs/common';
import { BlogModule } from './blog/blog.module';

@Module({
imports: [BlogModule],
controllers: [],
providers: [],
})
export class AppModule {}

Testing Your Application

Start your application using:

npm run start

Your NestJS application is now running! You can test the API using Postman or any other API client by hitting the endpoints /blog with appropriate HTTP methods.

Sample Requests:

  • Create a new post: POST /blog with Body { "id": 1, "title": "Hello World", "content": "This is a sample blog post." }
  • Retrieve all posts: GET /blog
  • Retrieve a single post by ID: GET /blog/1
  • Update a post: PUT /blog/1 with Body { "title": "Updated Title" }
  • Delete a post: DELETE /blog/1

Conclusion

Congratulations! You’ve built a simple blogging platform using NestJS. While this implementation uses in-memory storage for simplicity, in a real-world application, you’d integrate a database like PostgreSQL or MongoDB. You’d also implement features such as user authentication, validation, and more.

NestJS offers a flexible architecture that supports various extensions and can scale efficiently, making it a solid choice for building server-side applications.

Continue exploring NestJS and build upon this initial implementation to create a full-featured blogging platform. Happy coding!

--

--

@rnab
@rnab

Written by @rnab

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

Responses (1)