שיתוף מידע בין ראוטרים ב express js
-
אני מנסה ליצור פרוייקט קטן באקספרס לצורך תרגול בלבד, בלי DB ושמירת נתונים בכלל (אני יודע שזה מגוחך אבל מה לעשות, לא מבין בדטהבייס עדיין).
כתבתי class לניהול המשתמשים (כמובן שברגע שנופל השרת מכל סיבה שהיא לא נשאר כלום מהמידע), ה class נראית בערך ככה:
class Users { constructor() {} createUser() {} editUserProfile() {} deleteUser() {} }
זה בגדול המתודות של ה class, ואני עושה לו export singleton ככה:
module.exports = new Users();
כמובן שיש בקלאס מערך של המשתמשים, שאליו הם נוספים.
בנוסף יש לי תקייה שאחראית על הניתוב בשם 'routes', בתיקייה הזאת שמתי ראוטר להתחברות 'login', וראוטר להרשמה 'signup'.
בקובץ app.js אני צורך את הראוטרים עם require, ואני רוצה שכל הראוטרים של ה users כמו התחברות והרשמה, יקבלו את אותו קלאס דרך app.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