Farih.co.id
Home Programming Pengantar CQRS di NestJS

Pengantar CQRS di NestJS

nestjs cqrs article cover

Pendekatan umum untuk pengembangan NestJS adalah membangun layanan yang berkomunikasi dengan pengontrol untuk mengakses data. Tapi pendekatan ini bukan satu-satunya pola desain yang valid di NestJS. Ada pola desain lain, seperti pola desain CQRS.


CQRS adalah pola desain yang memisahkan operasi baca dan tulis dari suatu aplikasi. Pemisahan ini dapat membantu meningkatkan skalabilitas, kinerja, dan pemeliharaan.

Cari tahu semua tentang CQRS dan bagaimana Anda dapat menerapkannya saat membangun API NestJS.


Apa itu CQRS?

CQRS berdiri untuk pemisahan tanggung jawab perintah-permintaan. Ini mengimplementasikan penggunaan perintah untuk membuat, memperbarui, dan menghapus data dan kueri untuk mengambil data. Ini membantu menghilangkan kebutuhan untuk mengimplementasikan panggilan basis data aplikasi ke dalam layanan.

Ini juga memungkinkan perbedaan yang jelas antara logika kueri database untuk data dan melakukan tindakan lain dalam aplikasi.

Pendekatan CQRS berguna dalam desain berbasis domain, yang memungkinkan Anda memisahkan logika domain dan operasi infrastruktur di aplikasi Anda. Anda juga dapat menggunakannya untuk mengimplementasikan logika bisnis yang kompleks, tetapi ini tidak disarankan untuk aplikasi yang lebih sederhana.

Menggunakan CQRS di NestJS API

Anda dapat menggunakan pola desain CQRS di API yang Anda buat di NestJS. Untuk mengikuti, Anda harus menginstal Node.js di komputer Anda dan NestJS versi terbaru.

Gunakan langkah-langkah berikut untuk membuat aplikasi blog sederhana yang mengimplementasikan pola desain CQRS.

Buat Proyek Sarang

Buat proyek Nest baru dan hasilkan a pos sumber daya untuk aplikasi blog. Anda dapat melakukan ini dengan menjalankan perintah berikut di terminal:

 nest new nestjs-cqrs
nest g module posts
nest g controller posts
nest g service posts

Instal Dependensi

Setelah Anda menyelesaikan langkah-langkah di atas, jalankan perintah terminal ini untuk menginstal paket NestJS CQRS:

 npm install --save @nestjs/cqrs 

Buat Layanan Pos

Tambahkan kode berikut ke posts.service.ts file untuk menentukan PostService kelas.

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

export interface Post {
    title: string;
    content: string;
}

@Injectable()
export class PostService {
  private readonly posts: Post[] = [];

  create(post: Post): Post {
    this.posts.push(post);
    return post;
  }

  findById(id: number): Post {
    return this.posts.find(post => post.id === id);
  }
}

Itu PostService mendefinisikan membuat Dan findById metode untuk membuat postingan baru dan mendapatkan postingan yang sudah ada dari ID-nya.

Tentukan Perintah dan Pertanyaan

Langkah selanjutnya adalah menentukan kueri dan perintah yang merupakan inti dari pola desain CQRS.

Dalam posting direktori, buat dua file baru: buatPostCommand.command.ts Dan getPostQuery.query.ts. File perintah akan terlihat seperti ini:

 
export class CreatePostCommand {
  constructor(public readonly title: string, public readonly content: string) {}
}

Dan file definisi kueri, seperti ini:

 
export class GetPostQuery {
  constructor(public readonly id: number) {}
}

Membuat Penangan Perintah dan Kueri

Setelah Anda berhasil menentukan perintah dan kueri, Anda perlu membuat penangan untuknya. Handler adalah fungsi yang menjalankan perintah atau kueri dan mengembalikan hasilnya.

Membuat penangan.ts file di Anda pos direktori dan rekatkan kode berikut di dalamnya:

 
import { CommandHandler, ICommandHandler } from '@nestjs/cqrs';
import { CreatePostCommand } from './createPostCommand.command.ts';
import { PostService } from './post.service';

@CommandHandler(CreatePostCommand)
export class CreatePostHandler implements ICommandHandler<CreatePostCommand> {
  constructor(private readonly postService: PostService) {}

  async execute(command: CreatePostCommand) {
    const { name, price } = command;
    const post = await this.postService.create(title, content);
    return post;
  }
}

Pada bagian yang sama penangan.ts file, Anda dapat memodifikasi pernyataan impor untuk memasukkan yang di bawah ini, untuk memungkinkan bekerja dengan kueri. Anda kemudian dapat mengimplementasikan penangan kueri seperti yang terlihat pada kode di bawah ini:

 
import { QueryHandler, IQueryHandler } from '@nestjs/cqrs';
import { GetPostQuery } from './getPostQuery.query';
import { PostService } from './post.service';


@QueryHandler(GetProductQuery)
export class GetPostHandler implements IQueryHandler<GetPostQuery> {
  constructor(private readonly postService: PostService) {}

  async execute(query: GetPostQuery) {
    const { id } = query;
    const post = await this.postService.findOneById(id);
    return post;
  }
}

Daftar Handler

Langkah terakhir adalah mendaftarkan penangan perintah dan kueri dengan modul NestJS.

 
import { Module } from '@nestjs/common';
import { CommandHandlers, QueryHandlers } from 'handlers.ts';
import { PostService } from './post.service';

@Module({
  providers: [
    PostService,
    ...CommandHandlers,
    ...QueryHandlers,
  ],
})
export class PostModule {}

Kode ini mendaftarkan PostService, CommandHandlersDan QueryHandlers dalam penyedia Himpunan. Penggunaan operator spread () adalah untuk menggabungkan array dari pertanyaan penangan dan memerintah penangan ke dalam penyedia Himpunan.

Jalankan Perintah dan Pertanyaan

Perintah terdaftar dan penangan kueri dapat digunakan di pengontrol. Kode berikut adalah implementasi dari a posting controller yang akan menerima permintaan HTTP dan mengembalikan respons yang diperlukan.

 
import { Body, Controller, Post } from '@nestjs/common';
import { CommandBus } from '@nestjs/cqrs';
import { CreatePostCommand } from './createPostCommand.command.ts';


@Controller('posts')
export class PostController {
  constructor(private readonly commandBus: CommandBus) {}

  @Post()
  async createPost(@Body() body: { title: string; content: string }) {
    const { title, content } = body;
    const command = new CreatePostCommand(title, content);
    const post = await this.commandBus.execute(command);
    return post;
  }
}

Pada kode di atas, the CommandBus mengeksekusi CreatePostCommand dan membuat postingan baru.

Kode ini menunjukkan cara menerapkan pengontrol yang menggunakan kueri:

 
import { Controller, Get, Param } from '@nestjs/common';
import { QueryBus } from '@nestjs/cqrs';
import { GetPostQuery } from './getPostQuery.query';

@Controller('posts')
export class PostController {
  constructor(private readonly queryBus: QueryBus) {}

  @Get(':id')
  async getPost(@Param('id') id: number) {
    const query = new GetPostQuery(id);
    const post = await this.queryBus.execute(query);
    return post;
  }
}

Itu queryBus mengeksekusi GetPostQuery yang mendapatkan kiriman dengan ID yang diberikan dan mengembalikannya.

Setelah menyelesaikan semua langkah di atas, Anda sekarang harus memiliki aplikasi minimalis yang berfungsi untuk membuat dan mengambil postingan blog.

Meskipun kode di sini menggunakan larik untuk menyimpan postingan yang dibuat di memori, Anda lebih cenderung menggunakan database dalam produksi. Anda bisa menggunakan database SQL, atau database NoSQL seperti MongoDB, karena NestJS mendukung kedua opsi tersebut.

Membangun API Dengan Pola Desain CQRS

Memasukkan pola desain CQRS ke dalam aplikasi NestJS Anda dapat membantu dalam skalabilitas, kinerja, dan pemeliharaan. CQRS memungkinkan operasi yang lebih efisien dan dioptimalkan dengan memisahkan operasi baca dan tulis yang dilakukan aplikasi.

Paket @nestjs/cqrs menyediakan blok bangunan untuk mengimplementasikan CQRS di NestJS dengan perintah dan penangan kueri. Secara keseluruhan, CQRS adalah pola yang kuat yang dapat membantu membuat aplikasi yang lebih efisien dan dapat diskalakan, dan Anda harus mempertimbangkan pilihan Anda sebelum menggunakannya.

Comment
Share:

Leave a Reply

Your email address will not be published. Required fields are marked *

Ad