תתי הפניות ב express
-
@upsilon01 אמר בתתי הפניות ב express:
מה הכוונה אפשר?
מה יקרה?ככה: אחרי שפעם אחת ייכנסו לניתוב הראשי, יירשמו הניתובים הבנים, ולא תתקבל תשובה לבקשה כלל.
כשייכנסו לניתובי הבנים כן יקבלו את התשובות עם המשתנה עם הערך המתאים שהיה בזמן הכניסה לניתוב הראשי (המשנה "נלכד").
כל פעם נוספת שייכנסו לניתוב הראשי יירשמו שוב האירועים לניתובי הבנים מה שאומר שביקור בודד בניתובים הללו יפעיל את הפונקציה שוב ושוב כמספר הפעמים שנכנסו לניתוב האב, אבל כתשובה יקבלו תמיד את הראשונה. -
שייך בצורה יותר מסודרת.
עיין פה -
@חוקר כמה הארות על הקוד שלך:
- אתה לא צריך לדאוג לקוד תגובה 200, ולא להידר Content-Type, אקספרס כבר עושה את העבודה השחורה הזו, תשתמש במתודה
res.setHeader('Access-Control-Allow-Origin', '*')
- גם לא צריך להמיר את ה JSON למחרוזת, גם לזה אקספרס דואג, תעשה
res.send(maslulim_to_api)
3.לא צריך לנתח את ה URL בכל בקשה, אקספרס מגיש לך את זה מוכן כך:
req.query.someQuery
- לדעתי מה שחסר לך זה לא ראוטינג אלא middleware אבל זה ניחוש, אם תפרט מה בדיוק הצורך שלך יהיה אפשר לדייק
-
@יוסף-בן-שמעון
בגדול הנקודה היא כך:
ישנם פעולות אני רוצה לבצע בכל גישה לסקריפט לכתובת ivr לדוגמא, והוא האם כעת זה שעות פעילות, ובאם לא, השרת יגיב שהמערכת סגורה.
מתחת זה אני רוצה בנתיב ivr/get_limud שהמערכת תחזיר בתשובה את הלימודים היומיים, ובנתיב ivr/get_maslul המערכת תחזיר את רשימת המסלולים.
וכדומה על זה הדרך, שחלק מהקוד הוא גלובאלי, וחלק מהקוד הוא לפי הנתיב.
אני יודע שניתן לעשות פונקציה ולהפעיל אותה בכל נתיב לעצמו, אבל אני חושב שיהי לי הרבה יותר קל ונכון לסדר למעלה את מה שגלובאלי, ולמטה לכל נתיב את הפעולות של הנתיב. ואפילו ליצור תתי נתיבים.
תודה -
@יוסף-בן-שמעון אמר בתתי הפניות ב express:
@חוקר כמה הארות על הקוד שלך:
- אתה לא צריך לדאוג לקוד תגובה 200, ולא להידר Content-Type, אקספרס כבר עושה את העבודה השחורה הזו, תשתמש במתודה
res.setHeader('Access-Control-Allow-Origin', '*')
- גם לא צריך להמיר את ה JSON למחרוזת, גם לזה אקספרס דואג, תעשה
res.send(maslulim_to_api)
3.לא צריך לנתח את ה URL בכל בקשה, אקספרס מגיש לך את זה מוכן כך:
req.query.someQuery
- לדעתי מה שחסר לך זה לא ראוטינג אלא middleware אבל זה ניחוש, אם תפרט מה בדיוק הצורך שלך יהיה אפשר לדייק
תודה על הערותיך, אני אוהב ללמוד ולהתלמד מהדברים שבין השורות.
טוב שאתה קורא אותי ומבין את הקוד לעצם העניין מה אני יכול לשפר, הקלת עלי. -
@חוקר אז אתה צריך middleware, כתוב כך:
app.use('/ivr', (req, res, next)=>{ res.setHeader('Access-Control-Allow-Origin', '*') if(someCondition) res.send("המערכת סגורה") else next() }) app.use('/ivr/get_limud', (req, res)=>{ res.send('לימוד יומי') }) app.use('/ivr/get_maslul', (req, res)=>{ res.send('מסלול') })
כשאתה קורא לפונקציה next זה ממשיך הלאה לנתיבים הבאים, אם התקיים התנאי ולא קראת לה זה נעצר מיד
-
@יוסף-בן-שמעון אמר בתתי הפניות ב express:
@חוקר אז אתה צריך middleware, כתוב כך:
נראה לי שזה אכן מה שהייתי צריך!
תודה -
@יוסף-בן-שמעון אמר בתתי הפניות ב express:
if(someCondition) res.send("המערכת סגורה")
else next()לשם ההבנה, למה עשית את זה בתוך תנאי? כי ממ"נ אם אני עושה send או end זה אמור לסיים את הריצה, לא?
-
@חוקר אמר בתתי הפניות ב express:
@יוסף-בן-שמעון אמר בתתי הפניות ב express:
if(someCondition) res.send("המערכת סגורה")
else next()לשם ההבנה, למה עשית את זה בתוך תנאי? כי ממ"נ אם אני עושה send או end זה אמור לסיים את הריצה, לא?
כי אתה לא רוצה לסיים את ההתקשרות אם המערכת פתוחה.
-
@חוקר אמר בתתי הפניות ב express:
@אהרן אמר בתתי הפניות ב express:
כי אתה לא רוצה לסיים את ההתקשרות אם המערכת פתוחה.
אכן
התכוונתי לשאול בעיקר החלק השני, שלכאורה החלק שלelse next()
מיותר
אלא א"כ כפי שהוא כתב מקודם:
כשאתה קורא לפונקציה next זה ממשיך הלאה לנתיבים הבאים, אם התקיים התנאי ולא קראת לה זה נעצר מיד -
@חוקר אמר בתתי הפניות ב express:
@חוקר אמר בתתי הפניות ב express:
@אהרן אמר בתתי הפניות ב express:
כי אתה לא רוצה לסיים את ההתקשרות אם המערכת פתוחה.
אכן
התכוונתי לשאול בעיקר החלק השני, שלכאורה החלק שלelse next()
מיותר
אלא א"כ כפי שהוא כתב מקודם:
כשאתה קורא לפונקציה next זה ממשיך הלאה לנתיבים הבאים, אם התקיים התנאי ולא קראת לה זה נעצר מידנו
אתה שואל אם הוא צודק?אגב, אפשר לעשות גם כך
app.get('/ivr/get_limud', func1, func2) function func1(req, res, next) { //..... next(); } function func(req, res) { res.end('finish') }
זה לא מתאים לדוגמא הספציפית אבל דומה
-
@חוקר אמר בתתי הפניות ב express:
@אהרן אמר בתתי הפניות ב express:
כי אתה לא רוצה לסיים את ההתקשרות אם המערכת פתוחה.
אכן
התכוונתי לשאול בעיקר החלק השני, שלכאורה החלק שלelse next()
מיותר
כשאתה קורא ל
res.end()
אתה לא עוצר את הריצה של הפונקציה, אתה מסיים את התקשורת עם הקליינט, הפונקציה עצמה ממשיכה לרוץ, זה שני דברים שונים.
תנסה לדוגמא כך:res.end(); console.log("res is ended");
ותראה את ההדפסה בקונסול, אפשר לא רק להדפיס אלא לעשות כל דבר אחר, להתחבר למסד נתונים או למערכת קבצים או כל מה שתרצה, רק לא לשלוח עוד מידע לקליינט, לדוגמא אם תנסה כך:
res.end() res.write("hello")
תקבל שגיאה שהתקשורת כבר נסגרה ואז הפונקציה תכשל בגלל השגיאה.
אז אם לא תשים את זה בתוך else מה שיקרה שהפונקציה תמשיך ותקרא לשאר הנתיבים גם אם התקשורת כבר נסגרה, וזה יפלוט שגיאה.
-
@יוסף-בן-שמעון אמר בתתי הפניות ב express:
כשאתה קורא ל res.end() אתה לא עוצר את הריצה של הפונקציה, אתה מסיים את התקשורת עם הקליינט, הפונקציה עצמה ממשיכה לרוץ, זה שני דברים שונים.
מאה אחוז!
תודה על הלימוד