
getAllProducts מחזירה את כל המוצרים.getOneProduct מחפשת מוצר לפי ID, וכך אין צורך לחזור על החיפוש בכל קונטרולר.express.Router, ומעביר את הבקשה ללוגיקה. לכל ריסורס יש קובץ קונטרולר משלו./api/products.הטקסט המלא של הדקות הראשונות בהרצאה «חלוקה למודולים - קורס NodeJS» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אחרי שהצלחנו להרים רסט פול סרוויס ממש פשוט, שיש בו רק החזרה של כל המוצרים והחזרה של מוצר בודד, אנחנו רוצים להתחיל להוסיף את כל הפיצ'רים הנוספים, כמו הוספה של מוצר, עדכון של מוצר, מחיקה של מוצר,
אבל חכו, אנחנו עוד לא שם. לפני שנתחיל להוסיף את כל הפיצ'רים הנוספים שאמורים להיות ברסט פול סרוויס מלא, מה שאנחנו לא רוצים לעשות זה לכתוב את כל ה-Restful Service שלנו בקובץ אחד כי הולך להיות לנו פה הרבה קוד אז אנחנו רוצים לראות איך אפשר לחלק את כל הקוד הזה למספר מודולים כך שבעצם נוכל לבנות בצורה ממש פשוטה Restful
Service שהוא גם יחסית מורכב אז בסרטון הזה אנחנו עדיין לא הולכים להתעסק עם הוספה ועדכון וכדומה אלא רק לקחת את אותו התרגיל הזה ופשוט לעשות חלוקה הרבה יותר נכונה למספר מודולים.
כמובן שנבדוק את זה עם פוסטמן. אז הדבר הראשון שאנחנו צריכים להבין ושצריך להיות לנו מקור של הנתונים, ובדרך כלל יהיה דאטאבייס. כרגע אנחנו לא מתעסקים עם דאטאבייס אמיתי, אלא יש לנו פה איזשהו קולקשן, אז בואו נפריד אותו למשהו שנמצא בתיקייה נפרדת, נקרא לה דאטאבייס רק לצורך הדוגמה, ונגדיר בתוך ה-database
הזה products.js איזשהו קובץ שיחזיק את כל המוצרים. ניקח את כל המוצרים מפה, נגזור אותם ופשוט נזרוק אותם כאן. בהמשך כשיהיה לנו database נפרד כמובן שלא נצטרך את הקובץ הזה. הדבר הבא שאנחנו רוצים לבצע זה להבין שהאובייקט הזה שאנחנו יוצרים פה הוא לית'רל אובייקט וזה משהו שאנחנו לא כל כך נרצה
להתעסק איתו אנחנו רוצים להתעסק עם אובייקט שמגיע מקלאס אז הדבר הזה נקרא מודל. מודל זה בעצם מחלקה שמתארת ישות של מידע טהור כמו מוצר כמו לקוח כמו ספק כמו עובד טול, בגד, כל דבר שאנחנו בעצם רוצים להחזיר כ-resource.
אז אנחנו רוצים לבנות מחלקה שמייצגת כרגע מוצר בודד, ובמקום לבנות את ה-Litheral Object הזה ב-JavaScript, אנחנו רוצים לבנות אובייקט אמיתי ממנה.
מה מחלקה כזאת יכולה לתת לנו? ראשית, בדיקות. שנית, פונקציות נוספות אולי שאנחנו רוצים שיהיה לנו במוצר.
שלישית, ולידציה מהיוזר. אנחנו רוצים לצרף עוד תיקייה, נקרא לה מודלז, ושימו לב שמעכשיו התיקיות הופכות להיות ברבים.
למה? כי יכול להיות שאנחנו לא חושפים רק מוצרים, אלא שיכול להיות שאנחנו חושפים גם מוצרים, עובדים, ספקים ולקוחות. אז יהיה לנו כמה מודלים.
כל המודלים אנחנו זורקים בתיקיית מודלז. אז בואו נבנה כרגע פרודקט אחד, אפשר לקרוא לו לפעמים פרודקט מודל, אבל פרודקט זה מספיק, נקודת js שימו לב פרודקטס מכיל לי את כל המערך פרודקט מתאר מחלקה קלאס שמהווה מוצר בודד פרודקט אחד ויחיד אז יש לנו פה קלאס פרודקט יש לנו קונסטרקטור ובקונסטרקטור יש לנו את מה שיש במוצר בוא נניח
שבמוצר יש לנו את ה-id יש לנו את ה-name יש לנו פרייס נכון זה הדברים שהיו כאן ID name price בואו נוסיף גם סטוק שיהיה משהו קצת יותר עם בשר אז כאן אנחנו פשוט שמים this.id שווה ID this name שווה name כמו שלמדנו באובג'קט אוריינטד פרייס וסטוק הנה יש לנו כרגע קלאס שמתארת
מוצר בודד אנחנו כמובן נמצאים במודול נפרד ואנחנו רוצים לחשוף אותה החוצה מודול נקודה אקס פורטס ואנחנו לא בונים אובייקט ובתוכו שמים את הקלאס כמו שלמדנו אלא פשוט את שם הקלאס וזה אומר שמי שיעשה אימפורט או ליתר דיוק required לדבר הזה לפורדקט אז אוטומטית הוא יקבל את המחלקה פורדקט והנה יש לנו עכשיו את מחלקת המודל שלנו כעת אנחנו יכולים לחזור לאוסף המוצרים ולבנות
בצורה קצת אחרת את האוסף כרגע. דבר ראשון אנחנו רוצים את המחלקה product בואו נלך ל-require נעלה תקייה למעלה זה שתי נקודות כי אנחנו בתוך דאטאבייס אנחנו עולים ל-root directory הולכים לתקיית models ומוצאים את המודול של product.
נבנה פה מערך של כל המוצרים אבל הוא יהיה ריק ונתחיל להוסיף אליו product.push new product ואנחנו רואים שהמערכת אומרת לנו תנו לי תנו לי name, תנו לי price ותנו לי stock.
הנה יש לנו מוצר ראשון, שני, שלישי. בואו נשנה אותם, הנה 2, 3, בננה, פיץ', יש לנו כאן 4, 7, 5, 2 ובואו נניח שיש לנו פה 200 ו-300.
את זה ניפטר וכעת מה שאנחנו רוצים לעשות זה לחשוף החוצה, את כל המוצרים מודול נקודה אקס פורטס ופשוט פרודקטס בצורה כזאת יכלנו במקרה הזה גם לעשות את זה כאובייקט נפרד אבל כרגע זה מספק אותנו נקסט אנחנו נמצאים באוסף המוצרים הוא נמצא בפרודקטס js בדאטאבייס ואנחנו עוברים לחלק הבא החלק הבא שלנו זה בעצם איזשהו מודול שהתפקיד שלו זה פשוט לחשוף החוצה את המוצרים
מהדאטאבייס. אנחנו לא ניגשים ישירות לדאטאבייס של המוצרים. אז איך אנחנו עושים את זה? האמת, אולי כדאי לקרוא לזה database.js ואז בדאטאבייס שלנו כן נעשה את זה.
ואז מה שיקרה זה שאנחנו ניגש אליו על ידי זה database.products זה קצת יותר יפה ואז פה בדאטאבייס יכול להיות לנו כל מיני סוגים שונים של קולקשנים לא רק פרודקטס זה קצת נראה לי יותר הגיוני לביצוע למה הוא נותן לי product.js אולי הוא לא זוכר הנה דאטאבייס סבבה לא אני שיניתי את זה במקום הלא נכון אוי אוי אוי זה אמור להיות product זה התכוונתי
דאטאבייס ויש לנו עכשיו את הדאטאבייס שחושף מוצרים, או זה נראה לי קצת יותר אלגנטי. אז השכבה הבאה בתור שאנחנו רוצים לבנות נקראת data access layer זה בעצם תיקייה חדשה שאנחנו פותחים פולדר חדש בתוכו data access layer.js זה בעצם דל
דל זה data access layer, זה בעצם השכבה שניגשת לדאטאבייס, ואנחנו לוקחים const database שווה rickwire ופונים לdatabase/database ובתוכו עכשיו אנחנו רוצים את המוצרים.
אז יש לנו פה const product שווה database ומתוכו אנחנו שולפים את המוצרים. עכשיו אנחנו רוצים לגשת ולחשוף את המוצרים החוצה. את זה אנחנו עושים על ידי function getAllProductsReturn פרודקטס יש לנו את המוצרים לנו יש את הגישה למוצרים זאת השכבה הזאת המודול הזה הוא זה שרשאי לגשת לדאטה בייס בלבד מודול נקודה אקס פורטס
בואו ניתן את הפונקציה getAllProducts כעת יש לנו את דל שמסוגל להחזיר לנו את המוצרים מהדאטאבייס וכך אף אחד אחר לא ניגש לדאטאבייס ועושה אולי פעולות שאסור לו לבצע.
השכבה הבאה שאנחנו רוצים לבנות נקראת ביזנס לוג'יק. השכבה הזאת מכילה את הלוגיקה הדרושה באפליקציה שלנו.
הדל רק מביא את המידע מהדאטאבייס או מחזיר מידע לדאטאבייס. ביזנס לוג'יק מבצע פעולות חישוביות על המידע. זאת חלוקה בעצם שהיא מאוד נוחה עבור פרויקט שמתחיל לגדול ולגדול.
בביזנס לוג'יק יש לנו productlogic.js. למה בעצם? מפני שאולי בהמשך יהיה לנו כל מיני resources שונים. יכול להיות לנו מוצרים, ספקים, לקוחות, כמו שאמרנו.
כל לוגיקה, פעולות חישוביות של כל אחד מה-resources היא תבצע במודול נפרד משלה. כאן אנחנו רוצים את הדל, כי הדל הוא זה שמביא לנו את המידע מהדאטאבייס.
בואו נלך ל-required, ניגש ל-data access layer וניגש לדל ויש לנו כרגע את קובץ הדל. האמת שלא יבלבל אותנו, אני עוד פעם אשנה את השם הזה ל-db ואז בדל אני ניגש לדאטאבייס סלאש db זה הופך להיות db והופה db התכוונתי רק פה ופה ואז db נקודה product זה המוצרים מהדאטאבייס כאשר הדאטאבייס
הזה תיקייה והdb זה הקובץ בתוך. קצת יותר אולי קל להסתכל על זה אבל זה לא קשור אלינו כרגע יש לנו פה const dal אני נמצא בפעולות החישוביות שאני רוצה לבצע.
הפעולה הראשונה זה פשוט החזרת כל המוצרים ממש בצורה פשוטה מהדל. בואו נבנה function, נקרא לה גם כן get all products ונעשה const products שווה, ניגש לדל, יש לנו בדל פונקציה שנקראת get all products, אז היא מביאה לי את המוצרים ואני פשוט מחזיר אותם בצורה כזאת.
פונקציה נוספת שאנחנו רוצים זה פונקציה בחישובים שלנו כרגע, בואו נסתכל עוד פעם על האפ שהיה לנו. פונקציה ראשונה הייתה פונקציה שמחזירה את כל המוצרים ופונקציה שנייה הייתה פונקציה שמחזירה מוצר אחד.
אמרנו שרק את הפרויקט הזה אנחנו רוצים כרגע לחלק לחלקים השונים ולכן רק אותו אנחנו רוצים לבנות כאן. יש לנו פה function get one product ניתן את ה-id עבור הפונקציה נקבל קודם כל את המוצרים מהדל הדל מביננו אותם.
נמצא את המוצר האחד והיחיד שאנחנו רוצים, product find עבור כל מוצר, תחפש את המוצר שה-id שלו שווה ל-id שהתקבל לפונקציה, במידה והוא לא נמצא יוחזר לנו undefined ואנחנו מחזירים את המוצר האחד והיחיד הזה.
בואו נחשוף החוצה את שתי הפונקציות, מודול exports יש לנו כאן את get all, get one והביזנס לוג'יק שלנו שמחזיק חישובים רק של מוצרים מוכן. כעת אנחנו רוצים להמשיך ולהפריד את כל זה.
כל זה קיים בביזנס לוג'יק.