PracticU

עדכון מלא של מוצר ב-Mongoose

בלי כתוביותעם כתוביות
PracticU › קורס NodeJS › עדכון מלא של מוצר ב-Mongoose
מילון מושגים:
PUT - שיטת HTTP לשליחת נתונים לשרת כדי ליצור או להחליף משאב קיים במלואו.
מודל - רכיב שמייצג את הנתונים ואת הלוגיקה העסקית באפליקציה. גם ייצוג מופשט של מערכת או תהליך.
Promise - אובייקט ב-JavaScript שמייצג תוצאה עתידית של פעולה אסינכרונית, שתושלם בהצלחה או תיכשל.
MongoDB - מסד נתונים מסוג NoSQL שמאחסן נתונים כמסמכים בפורמט דמוי JSON, בלי מבנה טבלאי קשיח.
אסינכרוני - אופן פעולה שבו פעולה ארוכה רצה ברקע והתוכנית ממשיכה בלי להמתין לה, ומטופלת כשתסתיים.
קונטרולר - רכיב שמתווך בין הממשק לבין הלוגיקה והנתונים, מקבל בקשות ומחליט כיצד לטפל בהן (למשל בדפוס MVC).
Postman - כלי לבדיקת API: שליחת בקשות HTTP לשרת ובחינת התגובות, נפוץ בפיתוח ובבדיקות.
GET - שיטת HTTP לבקשת מידע מהשרת בלי לשנות אותו. הפרמטרים מועברים בדרך כלל בכתובת.

עדכון מלא של מוצר ב-Mongoose
עדכון מלא של מוצר ב-mongoose מתבצע בפונקציה אחת שמתאימה גם ל-PUT וגם ל-PATCH, והקוד קצר בהרבה מזה של הדרייבר הישיר.
השלבים העיקריים
1. מבחינים בין Product ל-product: Product באות גדולה הוא המודל, מחלקה ש-mongoose יצרה. product באות קטנה הוא האובייקט שמגיע כפרמטר לפונקציה.
2. מעדכנים: Product.updateOne({ _id: product._id }, product).exec(). הפרמטר הראשון הוא התנאי, והשני הוא המוצר המעודכן.
3. מקבלים info: ה-Promise מחזיר אובייקט info ולא את המוצר, כמו ב-MongoDB עצמו. לכן הפונקציה הופכת ל-async, ממתינים ל-await על ה-info ומחזירים את המוצר אם הוא נמצא, ואחרת null.
4. אין צורך בקוד הנוסף: לא ממירים ל-ObjectId, ולא מוחקים את ה-_id ומחזירים אותו.
5. מעדכנים את הקונטרולר: יוצרים new Product(request.body), מציבים בו את _id מתוך request.params, בלי ולידציה של Joi, וקוראים ל-updateProductAsync. אם התוצאה ריקה מחזירים 404.
חשוב: n לעומת nModified
ב-info יש n, מספר המסמכים שנמצאו, ו-nModified, מספר אלו שגם השתנו בפועל. כששולחים שוב אותם ערכים בדיוק, נמצא מסמך אחד אבל לא שונה אף אחד. בודקים את n, כך שהעדכון לא נחשב כשגיאה כשהערכים זהים.
בבדיקה ב-Postman עדכנו את green apple, ראו את השינוי ברשימה, בבקשת GET של מוצר בודד וב-Robo 3T.
אפשר עכשיו לעדכן מוצר ב-mongoose בלי קוד העזר שנדרש קודם.
השיעור הבא בקורס: עדכון חלקי של מוצר ב-Mongoose

פרקי ההרצאה: עדכון מלא של מוצר ב-Mongoose

  1. 00:00

    פונקציה אחת ל-PUT ול-PATCH

  2. 00:47

    ההבדל בין Product למופע product

  3. 01:22

    עדכון עם updateOne ו-exec

  4. 02:01

    אובייקט info שמחזיר MongoDB

  5. 02:58

    שימוש ב-async ו-await

  6. 03:34

    בדיקת התוצאה והחזרת המוצר המעודכן

תמלול ההרצאה: עדכון מלא של מוצר ב-Mongoose

הטקסט המלא של הדקות הראשונות בהרצאה «עדכון מלא של מוצר ב-Mongoose» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:03

    אנחנו כעת רוצים לבצע עדכון של מוצר. כשבנינו את זה בעבר בעזרת MongoDB Native, בנינו את זה כפונקציה אחת שמתאימה גם לפוסט וגם, סליחה, גם לפוט וגם לפאץ'.

  2. 00:20

    גם כאן מספיקה לנו פונקציה אחת, אבל כמובן שהיא תהיה הרבה פחות מסועפת. בואו נראה איך עושים את זה. אז דבר ראשון, קיבלנו כאן את המוצר לעדכון. תכף אנחנו כמובן צריכים ללכת לקונטרולר ולראות מה קורה שם בשביל להתאים את זה.

  3. 00:40

    ויש לנו כאן פונקציה product.update1. שימו לב רק שיש הבדל בין פרודקט עם פי גדולה לפרודקט עם פי קטנה. פרודקט עם פי גדולה זה המודל עצמו, זה הקלאס שנוצרת לנו על ידי מונגוס בעזרת פונקציית מודל פה, שמחזירה לנו את הדבר הזה, אנחנו חושפים אותו החוצה זה כביכול קלאס ואנחנו יכולים ליצור מהקלאס אובייקטים שימו

  4. 01:13

    לב פה New Product ואז שולחים את האובייקט לפונקציות אז כשאנחנו מתעסקים עם פי גדולה זה קלאס שאנחנו מביאים אותה מ-Required וכשאנחנו מתעסקים עם פי קטנה זה כמובן מה שמתקבל לפונקציה עצמה רק תזכורת לשים לב אותיות קטנות גדולות אנחנו רוצים Update 1

  5. 01:34

    ומה שאנחנו רוצים להגיד ל-Update 1 זה שאנחנו רוצים אובייקט שה-id שלו underline-id שווה לproduct.underline-id מה שהתקבל כאן בפונקציה.

  6. 01:52

    ולאחר מכן כפרמטר שני אנחנו רוצים לשלוח את המוצר לעדכון ו-execute. execute מחזירה לנו promise אבל ה-promise לא מחזיר לנו את המוצר עצמו. בואו נסתכל רגע מה native mongo db עושה.

  7. 02:15

    mongo db החזירה לנו אינפו. הרי מונגוס משתמשת מאחורי הקלעים במונגו db. אז אם מונגו db החזירה לנו אינפו, כלומר איזשהו אובייקט שמתאר הצלחה, כישלון, כמה פריטים בעצם שונו וכדומה, זה מה שמונגוס תחזיר לנו. היא יכולה להחזיר גם משהו אחר, אבל זה מה שהיא בחרה להחזיר.

  8. 02:38

    אנחנו עכשיו צריכים להחזיר בחזרה מ-update product async את המוצר עצמו שעודכן. אז איך אנחנו עושים את זה אם הפונקציה הזאת לא באמת מחזירה לנו את המוצר אלא אובייקט אינפו?

  9. 02:53

    מה שאנחנו רוצים לעשות זה לקבל את אובייקט האינפו, אבל אנחנו לא יכולים לקבל אותו בצורה כזאת מפני שכל הפונקציות האלה של מונגוס הם אסינכרוניות, אז אנחנו צריכים לקבל את זה על ידי ה-wait.

  10. 03:10

    אם אנחנו מקבלים את זה על ידי הווייט הפונקציה שלנו צריכה להיות אסינק אסינק למה לא היינו צריכים לעשות את זה בפונקציות הקודמות כי החזרנו ישירות פרומיסים.

  11. 03:22

    אם אנחנו מסתכלים לדוגמה על אקזק אנחנו רואים שהיא מחזירה לנו פרומיס אז אנחנו לא צריכים לבצע פה אסינק בפונקציה שלנו אסינק אנחנו עושים רק אם יש לנו הווייט בתוך הפונקציה.

  12. 03:35

    אז הנה עשינו פה הווייט יש לנו פה אסינק ועכשיו אנחנו יכולים להחזיר בעצם את הבדיקה הזאת, בואו נעתיק אותה ונשים אותה פה.

  13. 03:48

    הבדיקה הזאת אומרת אם info.result.n האמת זה לא בדיוק result זה ישירות n. אני אומר אולי נדפיס את זה בשביל לראות מה זה בעצם אבל לפי מה שאני זוכר זה n ולא result.n אם כן תביא לי את הפרודקט אם לא תביא לי את הנעם.

  14. 04:15

    בואו נעשה פה console.log info ואז נראה הכי טוב מה זה בעצם האובייקט info שמוחזר אלינו. בכל מקרה כל הקוד המסועף והמיותר הזה לא נדרש, הוא לא נדרש, שימו לב מה לא נדרש כאן, להתעסק

לקורס המלא: קורס NodeJS אונליין בעברית

ההרצאה הקודמת: הוספת מוצר חדש ל-Mongoose

ההרצאה הבאה: עדכון חלקי של מוצר ב-Mongoose

הרצאות קשורות מקורסים אחרים

  • עדכון מוצר בריאקט
  • עדכון מלא ב-SQL Database
  • עדכון של Kali
  • גיבוי אקטיבי מלא - Veeam

קורסים נוספים במסלול

  • קורס יסודות HTML - בניית אתר אינטרנט פשוט
  • קורס CSS 3 - בדגש על Flex & Grid
  • קורס Javascript כולל JQuery
  • קורס ג'אווה סקריפט מעשי - JavaScript
  • קורס TypeScript
  • קורס ריאקט - React