דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. שאלות לגבי כתיבת אפליקציית שרת יציבה (בנוד)

שאלות לגבי כתיבת אפליקציית שרת יציבה (בנוד)

מתוזמן נעוץ נעול הועבר תכנות
13 פוסטים 5 כותבים 314 צפיות 4 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD dovid

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

    מנצפךמ מנותק
    מנצפךמ מנותק
    מנצפך
    כתב ב נערך לאחרונה על ידי
    #4

    בדיקת הרשאות (authentication ו- authotization) אמורה להיעשות בשלב מוקדם יותר, של ה middleware.
    כלומר ב route אתה מגדיר לו איזה middleware הוא יעבור.

    אבל אתה אכן צריך לפעמים לגשת גם אח"כ ל user, כדי לדעת האם יש לו גישה לרשומה הספציפית שהוא מבקש (נניח שאתה מרשה לו לקבל רשימת ספרים, אבל רק של אגף ספציפי).ואת זה אני לא חושב שתמיד אפשר לבדוק ב middleware. כי זה מחוץ ל scope שלה הרבה פעמים.

    אני אישית מעביר את כל ה req. ואתה יכול לבנות middleware שיסדר לך אובייקט user בתוך ה req כרצונך.

    לגבי הטרנזקציות, לא הבנתי את המקרה.

    לגבי שאלה ב:
    אני לא מבין איך אתה ניגש למודל לא דרך ה controller. כלומר מה בדיוק מבנה השרת אצלך.
    אבל כמובן שהכל צריך להיות דרך ה controller.
    ואגב, לדעתי את רוב הלוגיקה של משיכה מה DB צריך לכתוב במודל עצמו.
    נניח findBookByAuthorName, או createNewBook.

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

    אך זו רק דעתי.

    נ.ב. אני מחכה לפוסט שלך על ה-Sequelize.

    yossizY תגובה 1 תגובה אחרונה
    2
    • dovidD dovid

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

      yossizY מנותק
      yossizY מנותק
      yossiz
      כתב ב נערך לאחרונה על ידי yossiz
      #5

      @dovid אמר בשאלות לגבי כתיבת אפליקציית שרת יציבה (בנוד):

      מה ממפה את הבקשות לפונקציות שבקונטרולר עם הפרמטרים שאמרת, שכבה שאתה עשית?

      כן, לא סיימתי לתאר את הכל כי כבר היו לי שאלות ולא רציתי לכתוב מגילה ארוכה מדי...

      בשכבה החיצונה יש את ה-routes ששם באמת יש בדיקת הרשאות כמו ש-@מנצפך כתב, וכל בקשה ממופה לפעולה באחת מהקונטרולרים

      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

      תגובה 1 תגובה אחרונה
      1
      • מנצפךמ מנצפך

        בדיקת הרשאות (authentication ו- authotization) אמורה להיעשות בשלב מוקדם יותר, של ה middleware.
        כלומר ב route אתה מגדיר לו איזה middleware הוא יעבור.

        אבל אתה אכן צריך לפעמים לגשת גם אח"כ ל user, כדי לדעת האם יש לו גישה לרשומה הספציפית שהוא מבקש (נניח שאתה מרשה לו לקבל רשימת ספרים, אבל רק של אגף ספציפי).ואת זה אני לא חושב שתמיד אפשר לבדוק ב middleware. כי זה מחוץ ל scope שלה הרבה פעמים.

        אני אישית מעביר את כל ה req. ואתה יכול לבנות middleware שיסדר לך אובייקט user בתוך ה req כרצונך.

        לגבי הטרנזקציות, לא הבנתי את המקרה.

        לגבי שאלה ב:
        אני לא מבין איך אתה ניגש למודל לא דרך ה controller. כלומר מה בדיוק מבנה השרת אצלך.
        אבל כמובן שהכל צריך להיות דרך ה controller.
        ואגב, לדעתי את רוב הלוגיקה של משיכה מה DB צריך לכתוב במודל עצמו.
        נניח findBookByAuthorName, או createNewBook.

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

        אך זו רק דעתי.

        נ.ב. אני מחכה לפוסט שלך על ה-Sequelize.

        yossizY מנותק
        yossizY מנותק
        yossiz
        כתב ב נערך לאחרונה על ידי
        #6

        @מנצפך אמר בשאלות לגבי כתיבת אפליקציית שרת יציבה (בנוד):

        אבל אתה אכן צריך לפעמים לגשת גם אח"כ ל user, כדי לדעת האם יש לו גישה לרשומה הספציפית שהוא מבקש (נניח שאתה מרשה לו לקבל רשימת ספרים, אבל רק של אגף ספציפי).ואת זה אני לא חושב שתמיד אפשר לבדוק ב middleware. כי זה מחוץ ל scope שלה הרבה פעמים.

        על דברים כאלו בדיוק התכוונתי. ב-middleware אפשר רק לחסום route שלם.

        ואתה יכול לבנות middleware שיסדר לך אובייקט user בתוך ה req כרצונך

        יש כבר, passport.

        אני לא מבין איך אתה ניגש למודל לא דרך ה controller. כלומר מה בדיוק מבנה השרת אצלך.

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

        📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

        dovidD תגובה 1 תגובה אחרונה
        1
        • yossizY yossiz

          @מנצפך אמר בשאלות לגבי כתיבת אפליקציית שרת יציבה (בנוד):

          אבל אתה אכן צריך לפעמים לגשת גם אח"כ ל user, כדי לדעת האם יש לו גישה לרשומה הספציפית שהוא מבקש (נניח שאתה מרשה לו לקבל רשימת ספרים, אבל רק של אגף ספציפי).ואת זה אני לא חושב שתמיד אפשר לבדוק ב middleware. כי זה מחוץ ל scope שלה הרבה פעמים.

          על דברים כאלו בדיוק התכוונתי. ב-middleware אפשר רק לחסום route שלם.

          ואתה יכול לבנות middleware שיסדר לך אובייקט user בתוך ה req כרצונך

          יש כבר, passport.

          אני לא מבין איך אתה ניגש למודל לא דרך ה controller. כלומר מה בדיוק מבנה השרת אצלך.

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

          dovidD מחובר
          dovidD מחובר
          dovid
          ניהול
          כתב ב נערך לאחרונה על ידי
          #7

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

          • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
          • בכל נושא אפשר ליצור קשר dovid@tchumim.com
          yossizY תגובה 1 תגובה אחרונה
          1
          • dovidD dovid

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

            yossizY מנותק
            yossizY מנותק
            yossiz
            כתב ב נערך לאחרונה על ידי yossiz
            #8

            @dovid אמר בשאלות לגבי כתיבת אפליקציית שרת יציבה (בנוד):

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

            מצויין, זה מה שרציתי לשמוע.
            (הגעתי לבסיס קוד קיים וזה לא היה ככה.)

            מי כתב את הפונקציות הללו כמו findById

            אני כתבתי.

            ואיך זה עובד יפה וגמרי לכל הקונטרולרים?

            לא הבנתי

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

            📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

            dovidD תגובה 1 תגובה אחרונה
            2
            • yossizY yossiz

              @dovid אמר בשאלות לגבי כתיבת אפליקציית שרת יציבה (בנוד):

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

              מצויין, זה מה שרציתי לשמוע.
              (הגעתי לבסיס קוד קיים וזה לא היה ככה.)

              מי כתב את הפונקציות הללו כמו findById

              אני כתבתי.

              ואיך זה עובד יפה וגמרי לכל הקונטרולרים?

              לא הבנתי

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

              dovidD מחובר
              dovidD מחובר
              dovid
              ניהול
              כתב ב נערך לאחרונה על ידי
              #9

              ואיך זה עובד יפה וגמרי לכל הקונטרולרים?

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

              • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
              • בכל נושא אפשר ליצור קשר dovid@tchumim.com
              clickoneC yossizY 2 תגובות תגובה אחרונה
              1
              • dovidD dovid

                ואיך זה עובד יפה וגמרי לכל הקונטרולרים?

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

                clickoneC מנותק
                clickoneC מנותק
                clickone
                כתב ב נערך לאחרונה על ידי clickone
                #10

                @dovid אם זה ORM נורמלי (וככה זה נראה) אז הוא אמור לדעת מה הPK ולפי זה לתשאל לבד בצורה גנרית.
                ככה זה לפחות בEF

                עריכה: כעת אני רואה שמדובר על הקונטרולר ולא על המודל. - אז אני מחזיר את המילים שלי.
                אולי הוא גם יורש מהמודל?

                אין טסט כמו פרודקשן.

                המייל שלי urivpn@gmail.com

                תגובה 1 תגובה אחרונה
                1
                • dovidD dovid

                  ואיך זה עובד יפה וגמרי לכל הקונטרולרים?

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

                  yossizY מנותק
                  yossizY מנותק
                  yossiz
                  כתב ב נערך לאחרונה על ידי yossiz
                  #11

                  @dovid
                  המודלים הם אובייקטים שיורשים מ-Sequelize.Model. הם ה-object שב-O של ORM...
                  האובייקט הזה מגיע עם כל מיני פונקציות שימושיות.
                  למשל אני מגדיר מודל בשם User ככה:

                  const User = sequelize.define('user', {
                    id: {
                      type: Sequelize.UUID,
                      defaultValue: Sequelize.UUIDV1,
                      primaryKey: true
                    },
                    number: {
                      type: Sequelize.INTEGER,
                      autoIncrement: true
                    },
                  // וכן הלאה כל העמודות ב-DB‏‏
                  

                  הפונקציה define מחזירה לי אובייקט User עם המון פונקציות שימושיות:

                  User.findAll({ where: { ...whereConditions }, include: [ ...tablesToJoin ] });
                  User.findByPK(pk, include: { tablesToJoin });
                  User.Update({ ...updates }, { where: { ... } })
                  // או אפשר לקרוא על מופע של יוזר
                  user.update(...);
                  user.getXXX // כאשר XXX הוא שם של טבלה משוייכת
                  

                  אני לא יודע מה המקביל של זה ב-EF, (אולי entity?)

                  שימוש בפונקציות האלו נקרא אצלי "גישה ישירה ל-DB", כי אין לוגיקה עסקית בפונקצית הגישה, אלא זה מתורגם ישירות לשאילתת SQL.

                  על גבי זה אני מוסיף שכבת לוגיקה שכולל בין השאר בדיקת הרשאות, "ניהול חשבונות" כמו הרצת כל מיני פעולות וטריגרים שצריכים לקרות בעת יצירת/עדכון אובייקט ב-DB וכו' וכו' בקיצור כל ה-business logic של האפליקציה.

                  בשכבה הזאת אני מוסיף לכל אובייקט פונקצית findById ועוד ממשפחת ה-CRUD שכוללים בתוכם את כל ה-business logic של האפליקציה כמו הרצת בדיקות/פעולות/טריגרים, פונקציות אלו כמובן מסתיימות בקריאה לשכבה שלמטה ממנו.

                  השכבה הזאת הוא בקבצי הקונטרולרים.

                  האם זה המכוון בקונטרולר? אני לא יודע... אף פעם לא היה נהיר לי מה אמור ליכנס בקונטרולר.

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

                  האם עכשיו השאלה יותר מובנת?

                  📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                  dovidD תגובה 1 תגובה אחרונה
                  2
                  • yossizY yossiz

                    @dovid
                    המודלים הם אובייקטים שיורשים מ-Sequelize.Model. הם ה-object שב-O של ORM...
                    האובייקט הזה מגיע עם כל מיני פונקציות שימושיות.
                    למשל אני מגדיר מודל בשם User ככה:

                    const User = sequelize.define('user', {
                      id: {
                        type: Sequelize.UUID,
                        defaultValue: Sequelize.UUIDV1,
                        primaryKey: true
                      },
                      number: {
                        type: Sequelize.INTEGER,
                        autoIncrement: true
                      },
                    // וכן הלאה כל העמודות ב-DB‏‏
                    

                    הפונקציה define מחזירה לי אובייקט User עם המון פונקציות שימושיות:

                    User.findAll({ where: { ...whereConditions }, include: [ ...tablesToJoin ] });
                    User.findByPK(pk, include: { tablesToJoin });
                    User.Update({ ...updates }, { where: { ... } })
                    // או אפשר לקרוא על מופע של יוזר
                    user.update(...);
                    user.getXXX // כאשר XXX הוא שם של טבלה משוייכת
                    

                    אני לא יודע מה המקביל של זה ב-EF, (אולי entity?)

                    שימוש בפונקציות האלו נקרא אצלי "גישה ישירה ל-DB", כי אין לוגיקה עסקית בפונקצית הגישה, אלא זה מתורגם ישירות לשאילתת SQL.

                    על גבי זה אני מוסיף שכבת לוגיקה שכולל בין השאר בדיקת הרשאות, "ניהול חשבונות" כמו הרצת כל מיני פעולות וטריגרים שצריכים לקרות בעת יצירת/עדכון אובייקט ב-DB וכו' וכו' בקיצור כל ה-business logic של האפליקציה.

                    בשכבה הזאת אני מוסיף לכל אובייקט פונקצית findById ועוד ממשפחת ה-CRUD שכוללים בתוכם את כל ה-business logic של האפליקציה כמו הרצת בדיקות/פעולות/טריגרים, פונקציות אלו כמובן מסתיימות בקריאה לשכבה שלמטה ממנו.

                    השכבה הזאת הוא בקבצי הקונטרולרים.

                    האם זה המכוון בקונטרולר? אני לא יודע... אף פעם לא היה נהיר לי מה אמור ליכנס בקונטרולר.

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

                    האם עכשיו השאלה יותר מובנת?

                    dovidD מחובר
                    dovidD מחובר
                    dovid
                    ניהול
                    כתב ב נערך לאחרונה על ידי
                    #12

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

                    לגבי קונטרולר, ההגדרה ה"טהורה" שלו זה שצריך להיות שמה כמה שפחות דברים... כלומר זה אכן לא מוגדר, אבל תפקידו צריך להיות סוג של איש קשר בין יחידות שונות (קלט/לוגיקה/פלט).
                    (כעת חיפשתי שוב, ומצאתי את ההתפתלויות האלו... https://stackoverflow.com/a/1015853/1271037).

                    • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                    • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                    dovidD תגובה 1 תגובה אחרונה
                    4
                    • dovidD dovid

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

                      לגבי קונטרולר, ההגדרה ה"טהורה" שלו זה שצריך להיות שמה כמה שפחות דברים... כלומר זה אכן לא מוגדר, אבל תפקידו צריך להיות סוג של איש קשר בין יחידות שונות (קלט/לוגיקה/פלט).
                      (כעת חיפשתי שוב, ומצאתי את ההתפתלויות האלו... https://stackoverflow.com/a/1015853/1271037).

                      dovidD מחובר
                      dovidD מחובר
                      dovid
                      ניהול
                      כתב ב נערך לאחרונה על ידי dovid
                      #13

                      כעת ראיתי שיש שפע חומר בחיפוש גוגל
                      "fat models and skinny controllers"
                      זה אגב ההגדרה שלמדתי בספר כלשהוא על MVC.

                      • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                      • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                      תגובה 1 תגובה אחרונה
                      6
                      תגובה
                      • תגובה כנושא
                      התחברו כדי לפרסם תגובה
                      • מהישן לחדש
                      • מהחדש לישן
                      • הכי הרבה הצבעות


                      בא תתחבר לדף היומי!
                      • התחברות

                      • אין לך חשבון עדיין? הרשמה

                      • התחברו או הירשמו כדי לחפש.
                      • פוסט ראשון
                        פוסט אחרון
                      0
                      • דף הבית
                      • קטגוריות
                      • פוסטים אחרונים
                      • משתמשים
                      • חיפוש
                      • חוקי הפורום