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

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

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

שימוש ב-MongoDB בנוד

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

    ראשית אני לא כ"כ משתמש בנוד, אז אני לא יודע דברים בסיסיים.
    אני מבין ראשית כל שכל השאלה נשענת על כך שא"א לעשות await require.

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

    const MongoClient = require('mongodb').MongoClient;
     
    const url = 'mongodb://localhost:27017';
    const dbName = 'dbname';
     
    const client = new MongoClient(url);
    let container = {};
     
    client.connect()
      .then(client => {
        console.log('Connected!');
        container.db = client.db(dbName);
      })
      .catch(err => {
        console.log('Failed to connect:', err);
      });
     
    module.exports = container;
    
    db = require('./db').db;
    

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

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

    @dovid אמר בשימוש ב-MongoDB בנוד:

    אני מבין ראשית כל שכל השאלה נשענת על כך שא"א לעשות await require.

    אפשר, אבל צריך לעטוף אותו בפונקציה בגלל שלא קיים toplevel await (אולי קיים בצורה נסיונית, לא בדקתי).

    בפתרון הנאיבי שלך הexport קורה לפני החיבור, ממילא הexport מוציא null.

    בדיוק

    אם ניתן לו אובייקט לכאורה תוכל למלא אותו בהמשך, כלומר ככה גם לא יעבוד?

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

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

    א תגובה 1 תגובה אחרונה
    0
    • dovidD מנותק
      dovidD מנותק
      dovid
      ניהול
      כתב ב נערך לאחרונה על ידי dovid
      #5

      @dovid אמר בשימוש ב-MongoDB בנוד:

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

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

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

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

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

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

          @dovid זה מה שרציתי לחסוך 😞
          ה-getDb הרי יחזיר פרומיס ולא DB ואז צריך לשרשר כל דבר עם then-ים...

          זה לא אמור להיות הבדל גדול כי כל הפעולות על ה-db הרי בין כך יהיו אסינכרנים אז מה איכפת לי שהמופע של ה-db גם אקבל בצורה אסינכרונית. אבל מה לעשות זה מעצבן אותי...
          נראה לי שספריות אחרות לא עובדים כך (sequelize לדוגמה) אלא מחזירים את ה-db סינכרונית ורק את הפעולות עליו עושים אסינכרוני.

          toplevel await היה עוזר הרבה כאן.

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

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

            @dovid זה מה שרציתי לחסוך 😞
            ה-getDb הרי יחזיר פרומיס ולא DB ואז צריך לשרשר כל דבר עם then-ים...

            זה לא אמור להיות הבדל גדול כי כל הפעולות על ה-db הרי בין כך יהיו אסינכרנים אז מה איכפת לי שהמופע של ה-db גם אקבל בצורה אסינכרונית. אבל מה לעשות זה מעצבן אותי...
            נראה לי שספריות אחרות לא עובדים כך (sequelize לדוגמה) אלא מחזירים את ה-db סינכרונית ורק את הפעולות עליו עושים אסינכרוני.

            toplevel await היה עוזר הרבה כאן.

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

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

            אכן נשגב מבינתי למה נוד לא עושים toplevel await (וגם למה הם לא הופכים הכל הכל במודולים שלהם מקאלבק לפרומייז).

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

              כעת אני מחפש ורואה פתרונות טובים יותר (כלומר בטוחים לגמרי)
              https://stackoverflow.com/a/49400334/1271037

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

                כעת אני חושב שלמה לא להכניס את כל טעינת האפליקציה לקאלבק?
                זה לגיטמי, אני מאשר את זה 🙂

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

                  כעת אני חושב שלמה לא להכניס את כל טעינת האפליקציה לקאלבק?
                  זה לגיטמי, אני מאשר את זה 🙂

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

                  @dovid אמר בשימוש ב-MongoDB בנוד:

                  כעת אני חושב שלמה לא להכניס את כל טעינת האפליקציה לקאלבק?

                  בדיוק באתי לכתוב את זה... תודה רבה!

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

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

                    @dovid אמר בשימוש ב-MongoDB בנוד:

                    אני מבין ראשית כל שכל השאלה נשענת על כך שא"א לעשות await require.

                    אפשר, אבל צריך לעטוף אותו בפונקציה בגלל שלא קיים toplevel await (אולי קיים בצורה נסיונית, לא בדקתי).

                    בפתרון הנאיבי שלך הexport קורה לפני החיבור, ממילא הexport מוציא null.

                    בדיוק

                    אם ניתן לו אובייקט לכאורה תוכל למלא אותו בהמשך, כלומר ככה גם לא יעבוד?

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

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

                    @yossiz אמר בשימוש ב-MongoDB בנוד:

                    שלא קיים toplevel await

                    בדרך
                    אבל זה לא דבש מוחלט.

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

                      הפיתרון הוא לכאורה להחזיר אובייקט שיעטוף את ה-db. כל פונקציה שנקרא על העטיפה יעשה קודם await לאובייקט ה-db האמיתי ואז יעביר את הפונקציה הלאה לאובייקט האמיתי.

                      האם יש דרך לעשות עטיפה כזאת בלי יותר מדי boilerplate? פשוט להגיד ל-JS שכל פונקציה שאני יקרא על האובייקט לא משנה מה השם שלו יעבור דרך קוד העטיפה?

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

                      @yossiz אמר בשימוש ב-MongoDB בנוד:

                      הפיתרון הוא לכאורה להחזיר אובייקט שיעטוף את ה-db. כל פונקציה שנקרא על העטיפה יעשה קודם await לאובייקט ה-db האמיתי ואז יעביר את הפונקציה הלאה לאובייקט האמיתי.

                      האם יש דרך לעשות עטיפה כזאת בלי יותר מדי boilerplate? פשוט להגיד ל-JS שכל פונקציה שאני יקרא על האובייקט לא משנה מה השם שלו יעבור דרך קוד העטיפה?

                      לא מבין את הבעיה
                      הקלאס מיד חוזר מכיל בתוכו את ה-DB
                      ופונקצית insert({1:2}) יכיל בתוכו בדיקה אם ה-DB מחובר, ומחזיר תמיד פרומיז.

                      כך תמיד עושים?!

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

                        כעת אני חושב שלמה לא להכניס את כל טעינת האפליקציה לקאלבק?
                        זה לגיטמי, אני מאשר את זה 🙂

                        א מנותק
                        א מנותק
                        אהרן
                        כתב ב נערך לאחרונה על ידי
                        #14

                        @dovid אמר בשימוש ב-MongoDB בנוד:

                        למה לא להכניס את כל טעינת האפליקציה לקאלבק?

                        לחזור לטרום ימי הפרומיז?

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

                          @dovid אמר בשימוש ב-MongoDB בנוד:

                          למה לא להכניס את כל טעינת האפליקציה לקאלבק?

                          לחזור לטרום ימי הפרומיז?

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

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

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

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

                            א מנותק
                            א מנותק
                            אהרן
                            כתב ב נערך לאחרונה על ידי
                            #16

                            @dovid אמר בשימוש ב-MongoDB בנוד:

                            נוד מאמצת ממש לאט את ההתקדמויות האלה

                            שמח שהם מאפשרים לדנו לעקוף אותם בקלות 🙂

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

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

                              א מנותק
                              א מנותק
                              אהרן
                              כתב ב נערך לאחרונה על ידי
                              #17

                              @dovid אמר בשימוש ב-MongoDB בנוד:

                              לא התכוונתי דוקא קלאבק, התכוונתי שהאפליקציה כולה תיטען מתוך פונקציה.

                              לא הבנתי מדוע לא להשתמש ב-await
                              (בפונקציית insert שאמור להיקרא מתוך פונקציה, לא ב-require)?

                              תגובה 1 תגובה אחרונה
                              0
                              • א אהרן

                                @yossiz אמר בשימוש ב-MongoDB בנוד:

                                הפיתרון הוא לכאורה להחזיר אובייקט שיעטוף את ה-db. כל פונקציה שנקרא על העטיפה יעשה קודם await לאובייקט ה-db האמיתי ואז יעביר את הפונקציה הלאה לאובייקט האמיתי.

                                האם יש דרך לעשות עטיפה כזאת בלי יותר מדי boilerplate? פשוט להגיד ל-JS שכל פונקציה שאני יקרא על האובייקט לא משנה מה השם שלו יעבור דרך קוד העטיפה?

                                לא מבין את הבעיה
                                הקלאס מיד חוזר מכיל בתוכו את ה-DB
                                ופונקצית insert({1:2}) יכיל בתוכו בדיקה אם ה-DB מחובר, ומחזיר תמיד פרומיז.

                                כך תמיד עושים?!

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

                                @אהרן אמר בשימוש ב-MongoDB בנוד:

                                ופונקצית insert({1:2}) יכיל בתוכו בדיקה אם ה-DB מחובר, ומחזיר תמיד פרומיז.

                                הפונקציה insert מוגדר כבר על ה-db. לא רציתי לעבור על כל הפונקציות של ה-db ולהעתיק אותם לקלאס. בשביל זה ביקשתי משהו שחוסך boilerplate.
                                בשפות דינאמיות אחרות יש אפשרות להגדיר פונקציה שירוץ אם קוראים לפונקציה לא קיימת על אובייקט. אם זה היה קיים ב-JS הייתי יכול לעשות פרוקסי ל-DB בקלות עם מעט מאוד קוד.

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

                                yossizY תגובה 1 תגובה אחרונה
                                1
                                • yossizY מנותק
                                  yossizY מנותק
                                  yossiz
                                  כתב ב נערך לאחרונה על ידי
                                  #19

                                  @dovid הבעיה היחידה שיש לי עכשיו היא ש-vscode לא מזהה את הטייפ של require('./db').db כנראה בגלל שנותנים לו ערך רק בתוך callback, ולכן אני לא מקבל השלמה אוטומטית.

                                  האמת היא שהגיע הזמן שאלמד typescript...

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

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

                                    @אהרן אמר בשימוש ב-MongoDB בנוד:

                                    ופונקצית insert({1:2}) יכיל בתוכו בדיקה אם ה-DB מחובר, ומחזיר תמיד פרומיז.

                                    הפונקציה insert מוגדר כבר על ה-db. לא רציתי לעבור על כל הפונקציות של ה-db ולהעתיק אותם לקלאס. בשביל זה ביקשתי משהו שחוסך boilerplate.
                                    בשפות דינאמיות אחרות יש אפשרות להגדיר פונקציה שירוץ אם קוראים לפונקציה לא קיימת על אובייקט. אם זה היה קיים ב-JS הייתי יכול לעשות פרוקסי ל-DB בקלות עם מעט מאוד קוד.

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

                                    @yossiz אמר בשימוש ב-MongoDB בנוד:

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

                                    זה קיים!
                                    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

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

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

                                      @yossiz אמר בשימוש ב-MongoDB בנוד:

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

                                      זה קיים!
                                      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

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

                                      @yossiz יפה מאוד! זה ממש יכול להיות שימושי להמון דברים.
                                      אני כעת חושב שזה יכול לפתור את בעיית הundefined ועוד כמה רעיונות.

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

                                        @yossiz יפה מאוד! זה ממש יכול להיות שימושי להמון דברים.
                                        אני כעת חושב שזה יכול לפתור את בעיית הundefined ועוד כמה רעיונות.

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

                                        @dovid אמר בשימוש ב-MongoDB בנוד:

                                        אני כעת חושב שזה יכול לפתור את בעיית הundefined ועוד כמה רעיונות.

                                        אני לא הייתי ברור, אני מתכוון שהרבה פעמים אני עושה שימוש באובייקט בjs כדי לעשות קיבוץ או פעולות אחרות של set (של key value). אם יש כזה דבר אפשר לעשות פוש לאיבר בלי לדעת אם הוא קיים הוא לא כאילו יש שמה כבר מערך (הפרוקסי ידאג ליצור אותו) וגם לבדוק count וכאלה דברים.
                                        תוך כדי כתיבה אני חושב שזה לא כזה מציאה כי אחרי הכל זה קוד, ועם פונקציות יכולתי לעשות הכל, אני אחשוב בהמשך למה נראה לי שזה יעזור לי 🙂 .

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


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

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

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