שתי תוכניות ראשונות ב node.js
נצלול לעבודה עם node.js דרך שתי תוכניות דוגמא. גם אם לא כל שורה תהיה ברורה בשיעור זה זה בסדר ובשיעורים הבאים נמשיך ללמוד יותר לעומק על כל אחד מהחלקים שיופיעו כאן.
1. הפעלת קוד JavaScript והדפסה למסך
נתחיל בקטן- כל תוכנית node.js היא בעצם תוכנית JavaScript ולכן אפשר לכתוב קוד JavaScript רגיל כמו שהיינו כותבים בדפדפן ולקבל את אותן תוצאות. נשים לב רק שאין לנו document או window ושבינתיים כל התוכניות רצות מהמסך השחור ומדפיסות טקסט אליו.
הקלידו את התוכנית הבאה בקובץ בשם app.js ושימרו:
// calculate and return n!
function factorial(n) {
let res = 1;
for (let i=1; i <= n; i++) {
res *= i;
}
return res;
}
console.log(factorial(4));
עברו למסך השחור כדי להריץ ולקבל את הפלט 24.
מה למדנו מהתרגיל:
קוד node.js תומך בכתיב ES6-7-8, ולכן אפשר היה להשתמש ב let כדי להגדיר משתנים.
בהיעדר דפדפן, הפקודה console.log היא דרך מועילה לראות מידע על המסך.
כל שאר הקוד שנכתוב הוא קוד JavaScript תקני לכל דבר, ולכן חשוב מאוד להכיר טוב את שפת JavaScript כדי להבין את Node.
2. שימוש בספריית http כדי להביא מידע מהרשת
נמשיך לדוגמא שניה כדי לדבר על מודולים ב node.js. רוב הקוד של נוד מגיע כספריות חיצוניות שאנחנו טוענים ומשלבים בקוד שלנו. חלק מהספריות האלה מגיעות עם node עצמו ומספקות את הפונקציונאליות הבסיסית של הכלי, וכמובן שאפשר גם להוסיף ולהתקין חבילות נוספות מהרשת.
רשימת כל המודולים המובנים ב node זמינה בתיעוד בקישור:
https://nodejs.org/api/index.html
כדי לטעון מודול ב node אנחנו משתמשים בפקודה require. הדוגמא הבאה טוענת את המודולים url ו https ומשתמשת בהם כדי לשלוף מידע מ API מרוחק:
const { URL } = require('url');
const https = require('https');
const url = new URL('https://swapi.dev/api/people/1/');
const req = https.request(url, (res) => {
console.log('statusCode:', res.statusCode);
console.log('headers:', res.headers);
res.on('data', (d) => {
process.stdout.write(d);
});
});
req.on('error', (e) => {
console.error(e);
});
req.end();
כאן כבר יש הרבה יותר קוד לדבר עליו. בואו נלך שורה-שורה ונראה מה אנחנו יכולים ללמוד מהדוגמא:
-
טעינת המודולים- הפקודה require טוענת מודול של node. מודול יכול להיות אוביקט, פונקציה, מספר או בעצם כל סוג מידע ב JavaScript. שני המודולים שלנו הם אוביקטים. מהמודול url מעניין אותי רק השדה URL ולכן לקחתי רק שדה בודד באמצעות Destructuring. את המודול https לקחתי במלואו ושמרתי לאוביקט באותו שם.
-
אחרי הטעינה אפשר להשתמש במודולים. השורה:
const url = new URL('https://swapi.dev/api/people/1/');
משתמשת בפונקציה url.URL כדי לבנות אוביקט url ולשמור אותו במשתנה. אוביקט זה יעבור עוד מעט לפונקציה request כדי לפנות לשרת המרוחק.
-
הטיפול בתקשורת דומה מאוד לבניית קוד Ajax בתוך דפדפן. אנחנו לא כותבים את הקוד שורה אחר שורה אלא מעבירים פונקציית Callback שתיקרא כאשר התקשורת תסתיים. אבל בגלל שהעבודה היא מתוך צד השרת אנחנו מקבלים רזולוציה הרבה יותר גבוהה לטיפול. ל request נעביר פונקציית callback שתיקרא כשנוצר חיבור לשרת ומידע מתחיל להישלח. אבל זה לא מספיק. בתוכה אנחנו מגדירים פונקציית callback נוספת שתיקרא כשמידע מהרשת יגיע. החלוקה לשני אירועים ולפונקציות טיפול שונות מאפשרת יותר גמישות.
-
שגיאות תקשורת מטופלות כאירוע נפרד וגם עבורן כתבנו Event Handler שידפיס את השגיאה למסך.
-
השורה האחרונה בתוכנית:
req.end();
היא החשובה ביותר. בדיוק כמו ש XMLHttpRequest היה צריך שנקרא ל send כדי לשלוח את הבקשה, כך ב node אנחנו צריכים לסמן ל request שסיימנו להכין את הבקשה ואפשר לצאת לדרך. אחרי end לא ניתן יותר לעדכן את פרטי הבקשה ורק אחריו הבקשה תישלח בפועל.
- באופן אוטומטי תוכנית node תסתיים רק כאשר כל תהליכים האסינכרוניים שלה הסתיימו. לכן אם מוחקים את end התוכנית נראית "נתקעת". היא פשוט מחכה שתשובה תגיע לבקשה שלכם, אבל אף אחד לא שלח את הבקשה עדיין ולכן היא תחכה לנצח. בתוכניות קודמות לא היו לנו תהליכים אסינכרוניים ולכן לא היתה לנו את הבעיה הזו.
שימו לב שבתוכנית השניה האתר שהדגמתי עליו עבר דירה והכתובת שלו כעת היא: