Gunakan pola CQRS dengan hati-hati dan Anda dapat membuat aplikasi Nest yang lebih bersih dan dapat diskalakan.

Pendekatan umum untuk pengembangan NestJS adalah membangun layanan yang berkomunikasi dengan pengontrol untuk mengakses data. Namun 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.

instagram viewer

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 memiliki Node.js diinstal di komputer Anda dan versi terbaru dari NestJS.

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:

sarang baru nestjs-cqrs
posting modul g sarang
pos pengontrol sarang g
pos layanan sarang g

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.

// posting.layanan.ts
impor { Dapat disuntikkan } dari'@nestjs/umum';

eksporantarmuka Pos {
judul: rangkaian;
isi: rangkaian;
}

@Injeksi()
eksporkelas PostService {
pribadi posting yang hanya bisa dibaca: Posting[] = [];

buat (posting: Posting): Posting {
ini.posts.push (posting);
kembali pos;
}

findById (id: nomor): Pos {
kembaliini.posting.temukan(pos => id pos.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:

// buatPostCommand.command.ts
eksporkelas CreatePostCommand {
konstruktor(publik judul yang hanya bisa dibaca: rangkaian, publik konten yang hanya bisa dibaca: rangkaian) {}
}

Dan file definisi kueri, seperti ini:

// getPostQuery.query.ts
eksporkelas DapatkanPostQuery {
konstruktor(publik id hanya baca: nomor) {}
}

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:

// penangan.ts
impor { CommandHandler, ICommandHandler } dari'@nestjs/cqrs';
impor { Buat Perintah Posting } dari'./createPostCommand.command.ts';
impor { PostService } dari'./post.service';

@CommandHandler(Buat Perintah Posting)
eksporkelas Buat PostHandler alat ICommandHandler {
konstruktor(pribadi readonly postService: PostService) {}

asinkron jalankan (perintah: CreatePostCommand) {
const { nama, harga } = perintah;
const posting = menungguini.postService.create (judul, konten);
kembali pos;
}
}

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:

// handler.ts
impor { QueryHandler, IQueryHandler } dari'@nestjs/cqrs';
impor { GetPostQuery } dari'./getPostQuery.query';
impor { PostService } dari'./post.service';

// penangan kueri
@QueryHandler(DapatkanProductQuery)
eksporkelas GetPostHandler alat IQueryHandler {
konstruktor(pribadi readonly postService: PostService) {}

asinkron jalankan (kueri: GetPostQuery) {
const { id } = kueri;
const posting = menungguini.postService.findOneById (id);
kembali pos;
}
}

Daftar Handler

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

// post.module.ts
impor { Modul } dari'@nestjs/umum';
impor { Penangan Perintah, Penangan Kueri } dari'penangan.ts';
impor { PostService } dari'./post.service';

@Modul({
penyedia: [
Layanan pasca,
...CommandHandler,
...PenanganKueri,
],
})
eksporkelas PostModul {}

Kode ini mendaftarkan PostService, CommandHandlers, Dan 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.

// posting.controller.ts
impor { Badan, Pengontrol, Pos } dari'@nestjs/umum';
impor { Bus Perintah } dari'@nestjs/cqrs';
impor { Buat Perintah Posting } dari'./createPostCommand.command.ts';

// pengontrol yang mengimplementasikan perintah
@Pengontrol('postingan')
eksporkelas PostController {
konstruktor(pribadi readonly commandBus: CommandBus) {}

@Pos()
asinkron buat Posting(@Tubuh() isi: { judul: rangkaian; isi: rangkaian }) {
const { judul, isi } = isi;
const perintah = baru CreatePostCommand (judul, konten);
const posting = menungguini.commandBus.execute (perintah);
kembali pos;
}
}

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

Kode ini menunjukkan cara menerapkan pengontrol yang menggunakan kueri:

// posting.controller.ts
impor { Pengontrol, Dapatkan, Param } dari'@nestjs/umum';
impor { QueryBus } dari'@nestjs/cqrs';
impor { GetPostQuery } dari'./getPostQuery.query';

@Pengontrol('postingan')
eksporkelas PostController {
konstruktor(pribadi QueryBus hanya baca: QueryBus) {}

@Mendapatkan(':pengenal')
asinkron dapatkanPost(@Param('pengenal') pengenal: nomor) {
const permintaan = baru GetPostQuery (id);
const posting = menungguini.queryBus.execute (permintaan);
kembali pos;
}
}

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 a basis data SQL, atau a Basis data 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.