השתמש בתבנית CQRS בזהירות ותוכל ליצור אפליקציות Nest נקיות יותר וניתנות להרחבה יותר.
גישה נפוצה לפיתוח NestJS היא לבנות שירותים שאיתם בקרים מתקשרים כדי לגשת לנתונים. אבל גישה זו אינה דפוס העיצוב התקף היחיד ב-NestJS. ישנן דפוסי עיצוב נוספים, כגון דפוס העיצוב CQRS.
CQRS הוא דפוס עיצובי המפריד בין פעולות הקריאה והכתיבה של אפליקציה. הפרדה זו יכולה לסייע בשיפור המדרגיות, הביצועים והתחזוקה.
גלה הכל על CQRS וכיצד אתה יכול ליישם אותו בעת בניית NestJS API.
מה זה CQRS?
CQRS מייצג הפרדת אחריות בשאילתת פקודה. הוא מיישם את השימוש ב פקודות כדי ליצור, לעדכן ולמחוק נתונים ו שאילתות כדי להביא נתונים. זה עוזר לבטל את הצורך ליישם את קריאות מסד הנתונים של אפליקציה לשירותים.
זה גם מאפשר הבחנה ברורה בין ההיגיון של שאילתת הנתונים במסד הנתונים לבין ביצוע פעולות אחרות באפליקציה.
גישת CQRS שימושית ב עיצוב מונחה תחום, המאפשר לך להפריד בין לוגיקה תחום ופעולות תשתית באפליקציה שלך. אתה יכול גם להשתמש בו כדי ליישם לוגיקה עסקית מורכבת, אבל זה לא מומלץ ליישומים פשוטים יותר.
שימוש ב-CQRS ב-NestJS API
אתה יכול להשתמש בדפוס העיצוב של CQRS ב-API שאתה בונה ב-NestJS. כדי לעקוב, אתה צריך
Node.js מותקן במחשב שלך וגרסה עדכנית של NestJS.השתמש בשלבים הבאים כדי לבנות אפליקציית בלוגים פשוטה המיישמת את דפוס העיצוב של CQRS.
צור פרויקט Nest
צור פרויקט Nest חדש והפק א הודעה משאב עבור יישום בלוג. אתה יכול לעשות זאת על ידי הפעלת הפקודות הבאות בטרמינל:
nest new nestjs-cqrs
פוסטים של מודול קן
עמודי בקר קן
פוסטים שירות קן g
התקן תלות
לאחר השלמת השלבים שלמעלה, הפעל את פקודת הטרמינל הזו כדי להתקין את חבילת NestJS CQRS:
npm install --save @nestjs/cqrs
צור שירות פוסטים
הוסף את הקוד הבא שלך posts.service.ts קובץ כדי להגדיר את PostService מעמד.
// posts.service.ts
יְבוּא { הזרקה } מ'@nestjs/common';יְצוּאמִמְשָׁק הודעה {
כותרת: חוּט;
תוֹכֶן: חוּט;
}@ניתן להזרקה()
יְצוּאמעמד PostService {
פְּרָטִי פוסטים לקריאה בלבד: פוסט[] = [];צור (פוסט: פוסט): פוסט {
זֶה.posts.push (פוסט);
לַחֲזוֹר הודעה;
}
findById (מזהה: מספר): הודעה {
לַחֲזוֹרזֶה.posts.find(הודעה => מזהה post.id);
}
}
ה PostService מגדיר לִיצוֹר ו findById שיטות ליצירת פוסט חדש ולקבל פוסט קיים מהמזהה שלו.
הגדר פקודות ושאילתות
השלב הבא הוא להגדיר את השאילתות והפקודות שהן הליבה לדפוס העיצוב של CQRS.
בתוך ה פוסטים ספרייה, צור שני קבצים חדשים: ליצורPostCommand.command.ts ו getPostQuery.query.ts. קובץ הפקודה אמור להיראות כך:
// createPostCommand.command.ts
יְצוּאמעמד CreatePostCommand {
בַּנַאִי(פּוּמְבֵּי כותרת לקריאה בלבד: חוּט, פּוּמְבֵּי תוכן לקריאה בלבד: חוּט) {}
}
וקובץ הגדרת השאילתה, כך:
// getPostQuery.query.ts
יְצוּאמעמד GetPostQuery {
בַּנַאִי(פּוּמְבֵּי מזהה לקריאה בלבד: מספר) {}
}
צור מטפלי פקודות ושאילתות
לאחר שהגדרת בהצלחה את הפקודות והשאילתות שלך, עליך ליצור עבורן מטפלים. מטפל הוא פונקציה שמפעילה פקודה או שאילתה ומחזירה את התוצאה.
ליצור handlers.ts קובץ שלך הודעה ספרייה והדבק בה את הקוד הבא:
// handlers.ts
יְבוּא { CommandHandler, ICommandHandler } מ'@nestjs/cqrs';
יְבוּא { CreatePostCommand } מ'./createPostCommand.command.ts';
יְבוּא { PostService } מ'./post.service';@CommandHandler(CreatePostCommand)
יְצוּאמעמד CreatePostHandler מיישם ICommandHandler{
בַּנַאִי(פְּרָטִי postService לקריאה בלבד: PostService) {}
אסינכרון בצע (פקודה: CreatePostCommand) {
const { שם, מחיר } = פקודה;
const פוסט = לְהַמתִיןזֶה.postService.create (כותרת, תוכן);
לַחֲזוֹר הודעה;
}
}
באותו handlers.ts קובץ, אתה יכול לשנות את הצהרות הייבוא כך שיכללו את אלה למטה, כדי לאפשר עבודה עם שאילתות. לאחר מכן תוכל ליישם את מטפל השאילתות כפי שניתן לראות בקוד שלהלן:
// handler.ts
יְבוּא { QueryHandler, IQueryHandler } מ'@nestjs/cqrs';
יְבוּא { GetPostQuery } מ'./getPostQuery.query';
יְבוּא { PostService } מ'./post.service';// מטפל בשאילתות
@QueryHandler(GetProductQuery)
יְצוּאמעמד GetPostHandler מיישם IQueryHandler{
בַּנַאִי(פְּרָטִי postService לקריאה בלבד: PostService) {}
אסינכרון בצע (שאילתה: GetPostQuery) {
const { id } = שאילתה;
const פוסט = לְהַמתִיןזֶה.postService.findOneById (מזהה);
לַחֲזוֹר הודעה;
}
}
רישום מטפלים
השלב האחרון הוא לרשום את מטפלי הפקודות והשאילתות במודול NestJS.
// post.module.ts
יְבוּא { מודול } מ'@nestjs/common';
יְבוּא { CommandHandlers, QueryHandlers } מ'handlers.ts';
יְבוּא { PostService } מ'./post.service';
@מודול({
ספקים: [
PostService,
...מנהלי פקודות,
...QueryHandlers,
],
})
יְצוּאמעמד PostModule {}
קוד זה רושם את PostService, CommandHandlers, ו QueryHandlers בתוך ה ספקים מַעֲרָך. השימוש באופרטור התפשטות (...) הוא למזג את המערכים של שאילתא מטפלים ו פקודה מטפלים לתוך ספקים מַעֲרָך.
בצע פקודות ושאילתות
הפקודות הרשומות ומטפלי השאילתות ניתנים לשימוש בבקרים. הקוד הבא הוא היישום של a פוסטים בקר שיקבל בקשות HTTP ויחזיר תגובות נדרשות.
// posts.controller.ts
יְבוּא { גוף, בקר, פוסט } מ'@nestjs/common';
יְבוּא { CommandBus } מ'@nestjs/cqrs';
יְבוּא { CreatePostCommand } מ'./createPostCommand.command.ts';// בקר שמיישם פקודה
@בקר('פוסטים')
יְצוּאמעמד PostController {
בַּנַאִי(פְּרָטִי commandBus לקריאה בלבד: CommandBus) {}
@הודעה()
אסינכרון createPost(@גוּף() body: { title: חוּט; תוֹכֶן: חוּט }) {
const { title, content } = גוף;
const פקודה = חָדָשׁ CreatePostCommand (כותרת, תוכן);
const פוסט = לְהַמתִיןזֶה.commandBus.execute (פקודה);
לַחֲזוֹר הודעה;
}
}
בקוד למעלה, ה CommandBus מבצע את CreatePostCommand ויוצר פוסט חדש.
קוד זה מראה כיצד ליישם בקר המשתמש בשאילתה:
// posts.controller.ts
יְבוּא { Controller, Get, Param } מ'@nestjs/common';
יְבוּא { QueryBus } מ'@nestjs/cqrs';
יְבוּא { GetPostQuery } מ'./getPostQuery.query';@בקר('פוסטים')
יְצוּאמעמד PostController {
בַּנַאִי(פְּרָטִי queryBus לקריאה בלבד: QueryBus) {}
@לקבל(':תְעוּדַת זֶהוּת')
אסינכרון getPost(@פארם('תְעוּדַת זֶהוּת') מזהה: מספר) {
const שאילתה = חָדָשׁ GetPostQuery (מזהה);
const פוסט = לְהַמתִיןזֶה.queryBus.execute (שאילתה);
לַחֲזוֹר הודעה;
}
}
ה queryBus מבצע GetPostQuery שמקבל את הפוסט עם המזהה הנתון ומחזיר אותו.
לאחר השלמת כל השלבים שלמעלה, כעת אמור להיות לך אפליקציה מינימליסטית ופועלת ליצירה ואחזור של פוסטים בבלוג.
למרות שהקוד כאן משתמש במערך לאחסון הפוסטים שנוצרו בזיכרון, סביר יותר שתשתמש במסד נתונים בייצור. אתה יכול להשתמש ב- a מסד נתונים של SQL, או א מסד נתונים NoSQL כמו MongoDB, שכן NestJS תומך בשתי האפשרויות.
בניית ממשקי API עם דפוס העיצוב של CQRS
שילוב דפוס העיצוב של CQRS באפליקציית NestJS שלך יכול לסייע בהרחבה, ביצועים ותחזוקה. CQRS מאפשר פעולות יעילות ומוטבות יותר על ידי הפרדת פעולות הקריאה והכתיבה שהאפליקציה מבצעת.
החבילה @nestjs/cqrs מספקת אבן בניין ליישום CQRS ב-NestJS עם פקודות ומטפלי שאילתות. בסך הכל, CQRS הוא דפוס רב עוצמה שיכול לעזור ליצור יישומים יעילים וניתנים להרחבה יותר, ועליך לשקול את האפשרויות שלך לפני השימוש בו.