
Product ל-product: Product באות גדולה הוא המודל, מחלקה ש-mongoose יצרה. product באות קטנה הוא האובייקט שמגיע כפרמטר לפונקציה.Product.updateOne({ _id: product._id }, product).exec(). הפרמטר הראשון הוא התנאי, והשני הוא המוצר המעודכן.async, ממתינים ל-await על ה-info ומחזירים את המוצר אם הוא נמצא, ואחרת null._id ומחזירים אותו.new Product(request.body), מציבים בו את _id מתוך request.params, בלי ולידציה של Joi, וקוראים ל-updateProductAsync. אם התוצאה ריקה מחזירים 404.n, מספר המסמכים שנמצאו, ו-nModified, מספר אלו שגם השתנו בפועל. כששולחים שוב אותם ערכים בדיוק, נמצא מסמך אחד אבל לא שונה אף אחד. בודקים את n, כך שהעדכון לא נחשב כשגיאה כשהערכים זהים.הטקסט המלא של הדקות הראשונות בהרצאה «עדכון מלא של מוצר ב-Mongoose» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אנחנו כעת רוצים לבצע עדכון של מוצר. כשבנינו את זה בעבר בעזרת MongoDB Native, בנינו את זה כפונקציה אחת שמתאימה גם לפוסט וגם, סליחה, גם לפוט וגם לפאץ'.
גם כאן מספיקה לנו פונקציה אחת, אבל כמובן שהיא תהיה הרבה פחות מסועפת. בואו נראה איך עושים את זה. אז דבר ראשון, קיבלנו כאן את המוצר לעדכון. תכף אנחנו כמובן צריכים ללכת לקונטרולר ולראות מה קורה שם בשביל להתאים את זה.
ויש לנו כאן פונקציה product.update1. שימו לב רק שיש הבדל בין פרודקט עם פי גדולה לפרודקט עם פי קטנה. פרודקט עם פי גדולה זה המודל עצמו, זה הקלאס שנוצרת לנו על ידי מונגוס בעזרת פונקציית מודל פה, שמחזירה לנו את הדבר הזה, אנחנו חושפים אותו החוצה זה כביכול קלאס ואנחנו יכולים ליצור מהקלאס אובייקטים שימו
לב פה New Product ואז שולחים את האובייקט לפונקציות אז כשאנחנו מתעסקים עם פי גדולה זה קלאס שאנחנו מביאים אותה מ-Required וכשאנחנו מתעסקים עם פי קטנה זה כמובן מה שמתקבל לפונקציה עצמה רק תזכורת לשים לב אותיות קטנות גדולות אנחנו רוצים Update 1
ומה שאנחנו רוצים להגיד ל-Update 1 זה שאנחנו רוצים אובייקט שה-id שלו underline-id שווה לproduct.underline-id מה שהתקבל כאן בפונקציה.
ולאחר מכן כפרמטר שני אנחנו רוצים לשלוח את המוצר לעדכון ו-execute. execute מחזירה לנו promise אבל ה-promise לא מחזיר לנו את המוצר עצמו. בואו נסתכל רגע מה native mongo db עושה.
mongo db החזירה לנו אינפו. הרי מונגוס משתמשת מאחורי הקלעים במונגו db. אז אם מונגו db החזירה לנו אינפו, כלומר איזשהו אובייקט שמתאר הצלחה, כישלון, כמה פריטים בעצם שונו וכדומה, זה מה שמונגוס תחזיר לנו. היא יכולה להחזיר גם משהו אחר, אבל זה מה שהיא בחרה להחזיר.
אנחנו עכשיו צריכים להחזיר בחזרה מ-update product async את המוצר עצמו שעודכן. אז איך אנחנו עושים את זה אם הפונקציה הזאת לא באמת מחזירה לנו את המוצר אלא אובייקט אינפו?
מה שאנחנו רוצים לעשות זה לקבל את אובייקט האינפו, אבל אנחנו לא יכולים לקבל אותו בצורה כזאת מפני שכל הפונקציות האלה של מונגוס הם אסינכרוניות, אז אנחנו צריכים לקבל את זה על ידי ה-wait.
אם אנחנו מקבלים את זה על ידי הווייט הפונקציה שלנו צריכה להיות אסינק אסינק למה לא היינו צריכים לעשות את זה בפונקציות הקודמות כי החזרנו ישירות פרומיסים.
אם אנחנו מסתכלים לדוגמה על אקזק אנחנו רואים שהיא מחזירה לנו פרומיס אז אנחנו לא צריכים לבצע פה אסינק בפונקציה שלנו אסינק אנחנו עושים רק אם יש לנו הווייט בתוך הפונקציה.
אז הנה עשינו פה הווייט יש לנו פה אסינק ועכשיו אנחנו יכולים להחזיר בעצם את הבדיקה הזאת, בואו נעתיק אותה ונשים אותה פה.
הבדיקה הזאת אומרת אם info.result.n האמת זה לא בדיוק result זה ישירות n. אני אומר אולי נדפיס את זה בשביל לראות מה זה בעצם אבל לפי מה שאני זוכר זה n ולא result.n אם כן תביא לי את הפרודקט אם לא תביא לי את הנעם.
בואו נעשה פה console.log info ואז נראה הכי טוב מה זה בעצם האובייקט info שמוחזר אלינו. בכל מקרה כל הקוד המסועף והמיותר הזה לא נדרש, הוא לא נדרש, שימו לב מה לא נדרש כאן, להתעסק