שאלות של מתחיל - מקצועי ב nodejs
-
הוספה קטנה לשאלה ג'
א. הדרך המקובלת היא כמו שאמר דוד, לכתוב את הפונקציה בקובץ כך://child-script.js function globalFunc(){ console.log("A") } module.exports = globalFunc;
ולייבא אותו כך
//main-script.js var globalFunc = require('./child-script.js') globalFunc()
אפשר גם ליצור משתנים גלובליים ממש, אם אתה מאתחל את המשתנה בלי להצהיר עליו עם var או let או function וכדומה, לדוגמא:
globalFunc = function(){ console.log("A") } globalVar = "globalVar"
ואז אתה עושה ממש כמו include בקובץ הראשי או בכל קובץ שהוא ממרחבי האפליקציה:
require('./child-script.js') globalFunc() console.log(globalVar )
והמשתנים האלה זמינים לך בכל האפליקציה.
אבל זכור לי שלא ממליצים לעבוד כך, כי זה יכול לגרום התנגשות בין משתנים בלי שימת לב, וגם אם אתה עובד עם IDE נורמלי כמו vscode הוא לא יודע לזהות את המשתנים ולא יתן לך הצעות להשלמה אוטומטית. -
@חוקר אמר בשאלות של מתחיל - מקצועי ב nodejs:
עוד משהו, בקשר לסביבת פיתוח, זה באמת חיסרון בשפות האלה יחסית ל PHP שצריך להשקיע יותר בסביבת פיתוח ואין את הפשטות של עריכת קובץ ושמירה, צריך קצת להתרגל לזה, אבל בשום אופן לא לפתח ישירות על השרת.
אני ממליץ על vscode, זה מגיע עם IDE אינטגרלי עבור נוד וזה מאד מקל על העבודה, אפשר לדבג לכבות ולרסט את השרת בקלות, יש הודעות שגיאה עם מצביע למיקום השגיאה, ההדפסה לקונסול בגירסאות האחרונות מאד משוכללת, זה מציין את השורה שמשם התבצעה הבקשה להדפסה (וזה מאד משמעותי כשאתה רוצה לדבג וללכוד שגיאות) זה מדפיס אובייקטים כמו שהדפדפן כרום מדפיס אותם עם אפשרות לפתוח לראות את כל השרשרת של האובייקט והמורישים שלו.
גם דבר חשוב , vscode מציע לך השלמה אוטומטית לפרמטרים ושאר ירקות, הוא תומך בטייפסקריפט וב jsdoc שמודיעות לך לאיזה סוגי משתנים הפונקציה מצפה, וזה משמעותי כשאתה משתמש בספריה חיצונית במקום לדפדף בין הקוד להדרכות של המפתח של הספריה.
ויש עוד מעלות שאיני זוכר כרגע, בכל אופן מאד מומלץ
בהצלחה -
עדיין לא התלהבתי מnodejs, אני צריך לעלות שלב למשהו יותר דינאמי, לחבר עליו מערכת אמיתית.
בינתיים בניתי מערכת אם התסריט הזה:
עדיין אינך רשום במערכת, הינך מועבר להרשמה חד פעמית
הקלט את שמך המלא, ולסיום הקש סולמית
הקש טלפון ליצירת קשר ולסיום הקש סולמית
לאחר הצליל הקלט את כתובתך המלאה, ולסיום הקש סולמית
השם שנקלט הוא
מספר הטלפון שהוקש הוא
הכתובת שהוקלטה היא
שלום ותודהנראה בהמשך מה הלאה
תודה בכל אופן על ההדרכות.
עדיין אני עובד משורת הפקודה, עדיין לא עם IDE.
מה שאני לא מבין שאחרי ביצוע שינויים בקובץ אני מקבל פלט:[nodemon] starting `node nodejs/test.js` events.js:183 throw er; // Unhandled 'error' event ^ Error: listen EADDRINUSE :::80 at Object._errnoException (util.js:1022:11) at _exceptionWithHostPort (util.js:1044:20) at Server.setupListenHandle [as _listen2] (net.js:1367:14) at listenInCluster (net.js:1408:12) at Server.listen (net.js:1492:7) at Object.<anonymous> (/home/ubuntu/nodejs/test.js:15:4) at Module._compile (module.js:652:30) at Object.Module._extensions..js (module.js:663:10) at Module.load (module.js:565:32) at tryModuleLoad (module.js:505:12) [nodemon] app crashed - waiting for file changes before starting...
אך בכל זאת השינויים מבוצעים ועובדים כפי השינויים, איך זה ייתכן? מה לא נכון בהבנה שלי?
-
@dovid @magicode
שאלה נוספת
לשם ההבנה, ברעיון זה אפשרי ותיקני לכתוב כמה קבצים נפרדים, וכל אחד יוגדר על פורט אחר, ולהפעיל אותם במקביל, ואז בעצם יש לנו כמה תהליכים של הנוד שהם פעילים בו זמנית כל אחד ליציאה אחרת?
כך היה נראה לי מהנסיונות שלי, כאשר הרצתי סקריפט חדש על פורט אחר, ושני הפורטים ממשיכים לעבוד.
האם זה בסדר? -
@WWW אמר בשאלות של מתחיל - מקצועי ב nodejs:
@clickone איך שהבנתי, במקרה שעובדים עם אסטריסק, יורדת הנחיצות לעובר ל node,
כי בין כך הקוד באמצע השיחה, לא כך?אדרבא זה אמור לעלות לדעתי.
כי אם זה תוך כדי קוד זה אומר שהבקשה תקועה כשהקוד ממתין למענה מאסטריסק.
ובקשה תקועה זה יקר, בPHP. -
@חוקר אני לא מכיר את החבילה הזו שאתה משתמש, לפי הפלט זה נראה שהוא מנסה להריץ פעמיים את האפליקציה ויש התנגשות בגלל ששתיהם מאזינות לאותו פורט, אולי אתה מעדכן בבת אחת שני קבצים אז הוא יורה פעמיים את העדכון?
בכל אופן לשאלתך איך השינויים מתבצעים, כנראה הפעם הראשונה נכשלת והפעם השניה עובדת -
@חוקר אמר בשאלות של מתחיל - מקצועי ב nodejs:
לשם ההבנה, ברעיון זה אפשרי ותיקני לכתוב כמה קבצים נפרדים, וכל אחד יוגדר על פורט אחר, ולהפעיל אותם במקביל, ואז בעצם יש לנו כמה תהליכים של הנוד שהם פעילים בו זמנית כל אחד ליציאה אחרת?
כך היה נראה לי מהנסיונות שלי, כאשר הרצתי סקריפט חדש על פורט אחר, ושני הפורטים ממשיכים לעבוד.
האם זה בסדר?
זה תקני כאשר אתה מריץ כמה אפליקציות נפרדות על אותו שרת, אז כל אפליקציה מאזינה לפורט אחר, אם מדובר באותה אפליקציה זה מיותר ומבזבז משאבים בלי צורך.
אם אני מבין נכון, מה שמניע אותך זה לקבל את נוד כמה שיותר דומה ל PHP, אז זה ניסיון סרק, אם אתה רוצה שרת פעיל במהירות, פשוט תתקין express. תכתוב את הפונקציות שאמורות לטפל בכל בקשה לפי ה URL, ותעשה ניתוב לפונקציה, יש מדריך טוב באתר של רן בר זיק על אקספרס וראוטינג. תתחיל ותדווח איפה נתקעת.
https://internet-israel.com/category/מדריכים/express/ -
@dovid @יוסף-בן-שמעון
איך אני יכול לשלוף נתונים נתונים מתוך אתר אחר ולהחזיר אותם לתוך משתנה?
משהו בצורתvar datafromurl = fetch('https://github.com/'); if (datafromurl = "ok"){ res.end(datafromurl); } else{ res.end("no"); }
לא הצלחתי להחזיר את הנתונים לתוך משתנה.
אשמח לעזרה בהקדם.
תודה -
@חוקר אמר בשאלות של מתחיל - מקצועי ב nodejs:
נוד היא סינכרונית, כלומר כשאתה שולח בקשה לשרת מרוחק המעבד ממתין לתשובה, בנתיים הקומפיילר לא מחכה אלא ממשיך לשורה הבאה, ועד שהתשובה מגיעה הוא כבר אוחז כמה שורות אח"כ ולכן הוא לא טוען את התשובה למשתנה.
הפתרון היא לעבוד עם callback או עם promise, לדוגמא במודול שאתה משתמש יש פרומיס מובנה, תראה כאן:
https://www.npmjs.com/package/node-fetch#plain-text-or-htmlfetch('https://github.com/') .then(res => res.text()) .then(body => console.log(body));
then הראשון ממיר את התשובה מאובייקט לטקסט, ומחזיר אותו ל then השני, ובשני אתה יכול לשלוח את התשובה לאיפה שאתה רוצה. משהו כזה:
app.get('/page', (req, res)=>{ fetch('https://github.com/') .then(response => response.text()) .then(body =>{ if (body = "ok"){ res.end(body); } else{ res.end("no"); } }); })```
-
@יוסף-בן-שמעון
תודה.
השאלה היא האם שייך כן לארוז את זה כפונקציה, כי אני רוצה לקבל json ולטפל אותו לנתח נתונים לתוך משתנים ועוד.
אני צריך אפשרות לקבל בסגנון שכתבתי בהתחלה.
יש מצב?
תודה -
@יוסף-בן-שמעון אמר בשאלות של מתחיל - מקצועי ב nodejs:
הפתרון היא לעבוד עם callback או עם promise, לדוגמא במודול שאתה משתמש יש פרומיס מובנה
מה זה פרומיס?
-
@חוקר אמר בשאלות של מתחיל - מקצועי ב nodejs:
@יוסף-בן-שמעון אמר בשאלות של מתחיל - מקצועי ב nodejs:
הפתרון היא לעבוד עם callback או עם promise, לדוגמא במודול שאתה משתמש יש פרומיס מובנה
מה זה פרומיס?
-
@חוקר אמר בשאלות של מתחיל - מקצועי ב nodejs:
@יוסף-בן-שמעון
תודה.
השאלה היא האם שייך כן לארוז את זה כפונקציה, כי אני רוצה לקבל json ולטפל אותו לנתח נתונים לתוך משתנים ועוד.
אני צריך אפשרות לקבל בסגנון שכתבתי בהתחלה.
יש מצב?
תודהאתה יכול במקום לכתוב
res.text()
להחליף ל
res.json()
ואז בפונקציה השניה אתה מקבל את הbody כ JSON
אגב יש מודול יותר פופולרי לבקשות משרתים מרוחקים, קוראים לו request, אתה יכול להתקין כךnpm i request
ולהשתמש כך:
var request = require('request'); app.get('/page', (req, res)=>{ request('https://github.com/', (err, response, body)=>{ body = JSON.parse(body); if(body.status == "ok") res.send("ok") else res.send("no") }) })
-
@יוסף-בן-שמעון
מצאתי את מה שרציתי..
https://www.npmjs.com/package/sync-request -
פוסט זה נמחק!