שיתוף מידע בין ראוטרים ב express js
-
@מוטי-אורן אמר בשיתוף מידע בין ראוטרים ב express js:
module.exports = new Users();
אם הבנתי אותך נכון . הבעיה היא בגלל שאתה יוצר כל פעם קלאס חדש.
אתה צריך להכניס אתnew Users
לתוך משתנה ותייצא את המשתנה. -
@מוטי-אורן אמר בשיתוף מידע בין ראוטרים ב express js:
module.exports = new Users();
אתה יוצר בכל פעם מופע חדש. אתה צריך לייצא את המחלקה ולא את האובייקט. תשנה ל:
module.exports = Users;
ותייבא לכל הראוטים כך:
const Users = require('users');
ב-app.js תיצור אובייקט מופע יחיד של המחלקה:
const Users = require('users'); const myUsers = new Users();
ואותו myUsers תיצא לראוטים.
-
@ב-ל כמו"כ ב:
module.exports = new Users();
זה מייצר מופע אחד של הקלאס בפעם הראשון שהוא מייבא את הקובץ. בכל שאר הפעמים זה אמור להחזיר אותו מופע. קריאה של
require
לא מריצה שוב את הקובץ אחרי הפעם הראשון.@odeddvir אמר בשיתוף מידע בין ראוטרים ב express js:
אתה יוצר בכל פעם מופע חדש
לכאורה לא. כנ"ל. למה אני טועה?
-
@yossiz אמר בשיתוף מידע בין ראוטרים ב express js:
למה אני טועה
אתה לא. אני טעיתי מחוסר ניסיון, ולא ידעתי שמודולים בנוד הם Singletons. אלא מעתה גם אני סקרן למה @מוטי-אורן מקבל מופע חדש בכל פעם...
-
-
@מוטי-אורן אמר בשיתוף מידע בין ראוטרים ב express js:
אתם אומרים...
נ.ב. הטעות שלי הייתה שעשיתי require מחדש בכל ראוטר.. זה מה שגרם ליצירת מופע חדש של המחלקה בכל פעם.
לא. אני אמרתי הפוך שזה לא אמור להיות בעיה ואני באמת עדיין לא מבין מה גרם לבעיה שלך (וגם @OdedDvir כנראה מסכים לדברים )
-
@yossiz רק עכשיו קלטתי. אני ממש מתנצל.. בעיקרון לא ניסיתי אפילו לעבוד בצורה הזאת, כי היה ברור לי (עדיין לא כל כך ברור לי איך זה כן עובד) שזה לא יעבוד. בכל מקרה תודה רבה לכולכם.
האמת כשאני חושב על זה - יכול אולי להיות שההסבר בזה הוא שה new ב export מבוצע רק פעם אחת? טוב, זה חידוש גדול בשבילי. הייתי בטוח שהייצוא מתבצע בכל פעם מחדש כולל ה new. בכל אופן, שוב תודה וסליחה על השאלה המיותרת.
-
@מוטי-אורן אמר בשיתוף מידע בין ראוטרים ב express js:
הטעות שלי הייתה שעשיתי require מחדש בכל ראוטר.. זה מה שגרם ליצירת מופע חדש של המחלקה בכל פעם
זהו שלא, המודול נטען על ידי נוד פעם אחת בלבד ומאז הוא מוכנס למטמון (קאש) ומשם הוא נטען בכל פעם כשמבקשים אותו (require)
וזה מה שכתבו כאן.
ועי' https://nodejs.org/api/modules.html#modules_caching