
addProductAsync מוסיפה את המוצר למערך, שומרת את כל הקובץ, ומחזירה את המוצר שנוסף.router.post מקבל את הנתונים מגוף הבקשה. לשם כך מוסיפים את ה-middleware express.json, שמכניס את הגוף לאובייקט request.body. בלעדיו הגוף אינו זמין./api/products עם JSON שאין בו ID. אחר כך בודקים שהמוצר מופיע ברשימה, ושהוא נשאר גם אחרי הפעלה מחדש של השרת.הטקסט המלא של הדקות הראשונות בהרצאה «הוספת מוצר חדש - קורס NodeJS» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו הולכים עכשיו להוסיף מוצר חדש ולצורך כך אנחנו הולכים לעבור על כל אחד מהמודולים כאן ולראות מה אנחנו צריכים לשנות או ליתר דיוק להוסיף בשביל לתמוך בהוספת מוצר. נתחיל מהשכבה הכי בסיסית הדאטאבייס. הדאטאבייס עצמו זה סך הכל קובץ אין לנו צורך לשנות בו שום דבר אנחנו יכולים לסגור את זה ואנחנו יכולים לעבור לשכבה הבאה הדל.
האם אנחנו כאן צריכים לבצע איזשהו שינוי? יש לנו כאן את הפונקציה שמביאה לנו את כל המוצרים, שם אנחנו יכולים להוסיף מוצר אחרי שקיבלנו את כל המוצרים ולשלוח את זה בחזרה לפונקציה הזאת שמוסיפה את כל המוצרים בחזרה לקובץ ודורסת את כל הקובץ הישן.
אז גם כאן אנחנו רואים שכרגע הכל עובד כמו שצריך. השכבה הבאה בתור שיש לנו כאן והביזנס ללוג'יק. פה אין לנו פונקציה שיכולה להוסיף מוצר חדש.
אז כאן זאת הפונקציה הראשונה שאנחנו הולכים לבנות. אז בואו נבנה כאן פונקציה חדשה, ונעשה אותה כמובן אסינכרונית, ונקרא לה add product async.
הפונקציה הזאת צריכה לקבל את המוצר להוספה, מפני שאנחנו בעצם לא מתעסקים עם ה-rout או עם ה-client, אנחנו רק מבצעים בפועל את הפעולה החישובית דרך הדל.
איך אנחנו מוסיפים מוצר קודם כל אני צריך שיהיו לי את כל המוצרים נניח יש לי עכשיו אותם כאן. כאשר אנחנו נלמד לעבוד עם דאטאבייסים אנחנו לא נצטרך ללכת לדאטאבייס ולקבל את כל המוצרים בשביל להוסיף מוצר חדש אנחנו ישירות נוסיף מוצר לדאטאבייס כרגע אנחנו עושים כאילו מיני דאטאבייס בתוך קובץ זה יש לנו אז אין לנו
ברירה אלא לקבל את המוצרים להוסיף את המוצר ולהחזיר אותו לקובץ. הדבר הבא שאנחנו רוצים זה לדעת מה ה-ID החדש שאנחנו רוצים לבצע בכדי להוסיף אותו ל-database או למוצר עצמו, לקובץ.
כאשר ה-client שולח לנו מוצר, אין לו ID. הוא לא אמור לתת לי ID. אני צריך לאתר ID ולהוסיף. כמובן שאני רוצה ID שלא קיים. אז בואו נייצר פה איזושהי פונקציית עזר כזאת, נקרא לה get-max-ID או get-new-ID.
ניקח פרודקטס, נרוץ על כל המערך ונחפש את ה-ID המקסימלי שיש במערך. זה לא בהכרח ה-ID האחרון, כי יכול להיות מצב שביצעו איזושהי מחיקה מסוימת של ה-ID האחרון מהדאטאבייס ועשו איזשהו שינוי מסוים ולכן אני לא יודע אם זה ה-ID האחרון
כן או לא, אני רוצה לאתר את ה-ID החדש. אז מה שאנחנו רוצים לעשות זה לקחת כאן איזה שהוא משתנה Max ID, נכניס את החור 0 כי אנחנו יודעים שכל ה-IDs הם חייבים להיות חיוביים, נרוץ ב-For each product of products עם ה-ID שאנחנו סורקים עכשיו הוא גדול מה-Max ID, maxid שווה ל-p.id ולבסוף אני מחזיר maxid
פלוס 1. יש לי פונקציה שמחזירה ID חדש, ניגש ל-product.id ונכניס get new ID. הנה כל המוצרים, תביא לי בבקשה ID חדש.
כמובן שכשיהיה לנו דאטאבייס לא נצטרך בכלל להתעסק עם הפונקציה הזאת, מפני שהדאטאבייס ייצר לנו איי-די חדש. לאחר מכן אני רוצה לפנות לכל המוצרים ולעשות פוש למוצר החדש שלנו, בסדר? לא להתבלבל עם המילה פרודקטס ברבים ופרודקט ביחיד. פרודקטס קיבלתי מהקובץ, זה כל המוצרים, פרודקט יחיד זה מה
שקיבלתי לפונקציה. אני מוסיף את המוצר היחיד לכל המוצרים. לאחר מכן דרך הדל אני רוצה לבצע save all products hashing. הנה כל המוצרים עם המוצר החדש בתוכם אבל אנחנו חייבים להמתין עד שזה יסתיים אז בואו נעשה פה ה-wait אנחנו לא מקבלים ממנו בחזרה שום דבר אז אנחנו יכולים לקרוא לזה בצורה כזאת ולבסוף אנחנו מחזירים
את המוצר החדש כולל ה-id שנמצא בתוכו בואו ניקח את הפונקציה add product async לפה נחשוף אותה אנחנו לא צריכים לחשוף החוצה את ה-get new id הזאת ואנחנו רוצים עכשיו לבנות ראוט מתאים.
אגב, את זה כמובן היה אפשר לבנות פה בשורה אחת, אבל לא נסבך כרגע את העניינים יותר מדי, אז בשביל שזה יהיה פשוט, רציתי לעשות את זה בפונקציה נפרדת בצורה הכי פשוטה.
בואו ניגש לקונטרולרס, ובקונטרולר אנחנו רוצים לבנות router.post בשביל להוסיף מוצר, אנחנו לא get, אנחנו פוסט לפי המוסכמות שלמדנו.
אם גולשים ל-API/Products, זה בעצם הנתיב היחסי לאפ, API/Products, בפוסט, אנחנו רוצים להפעיל פונקציה אסינק, ריקווסט, רספונס, בצורה כזאת, ומה שאנחנו רוצים לעשות זה, בפונקציה הזאת אנחנו רוצים לשלוף את המידע
שהיוזר הביא לי, קליינט הביא לי, ולהוסיף אותו כמוצר חדש. איפה המידע נמצא? אז לפי המוסכמה של ה-Rest שלמדנו, המידע נמצא ב-Body.
בי דיפולט אקספרס לא יודעת לקחת את המידע מה-Body ולתת לי אותו בצורה פשוטה. לצורך כך אני צריך ללכת לאקספרס, ל-App.js ליתר דיוק, ולהגדיר פה עוד Middleware, נהוג לבצע את זה אפילו פה למעלה.
server.use וה-middleware הזה נקרא express.json וזאת פונקציה. מה זה הדבר הזה? הפקודה הזאת פשוט אומרת ל-express, take the body values, נקרא לזה values, בסדר?
into a body object in the request. אנחנו בעצם בפקודה הזאת אומרים לאקספרס תוסיפי עוד איזה משהו אחד ואנחנו רוצים לעשות את זה בכל ריקווסט שיש למרות שלא בכל ריקווסט יש באדי אבל מקובל לבצע את זה כאן שאם יש מידע שנמצא בתוך הבאדי של הריקווסט אנחנו רוצים שאקספרס תשלוף לנו אותו לתוך בואו נעשה את זה אפילו יותר ברור כאן.
the body values into request.body object זה קצת יותר הגיוני בגלל שעשינו עכשיו את השורה הזאת בקונטרולר שלנו עכשיו יש לנו request.body לפני זה לא היה לנו את הדבר הזה וה-body עכשיו מכיל את הפרמטרים שנשלחו ב-request אז מה אנחנו עושים איתם מה שאנחנו רוצים לעשות זה ליצור לעצמנו אובייקט מוצר חדש.
קונסט פרודקט שווה ניו פרודקט. יש לנו את המחלקה שנקראת פרודקט עם פי גדולה. והמחלקה הזאת כבר כתבנו כאן, איפה היא נמצאת? במודל שלנו, הנה היא פה.
והיא מקבלת לקונסטרקטור איי-די, שאגב אין לנו כרגע. ניים, פרייס וסטוק, בסדר. בואו נגיד לו שהקונסטרקטור מקבל את ה-ID onDefind כי אין לי ID, היוזר לא