מדריך Node.js עם דוגמאות שאפשר להריץ
מדריך Node.js חינמי עם דוגמאות שרצות בתוך הדף: קבצים, מודולים, לולאת האירועים, שרתי Express שאפשר לשלוח אליהם בקשות, MongoDB ו-JWT. ערכו את הקוד והריצו אותו שוב.
להתחיל את הקורסצעדים ראשונים
- מה זה Node.jsNode.js היא סביבת הרצה שמריצה JavaScript מחוץ לדפדפן, על שרתים ובטרמינל. היא לא שפה ולא framework: היא V8 ועוד לולאת אירועים ועוד APIs לקבצים, לרשת ולתהליכים.
- Node.js מול JavaScriptJavaScript היא השפה; Node.js היא תוכנה שמריצה אותה מחוץ לדפדפן. התחביר זהה, אבל האובייקטים הגלובליים וה-APIs המובנים שמסביב לקוד שונים.
- process.argvprocess.argv הוא מערך של שורת הפקודה שהפעילה את התוכנית: קובץ ההרצה של node, הנתיב של הסקריפט, ואז כל ארגומנט שהקלדתם. השתמשו ב-process.argv.slice(2) כדי לקבל רק את הארגומנטים שלכם.
- process.envprocess.env הוא אובייקט שמחזיק את משתני הסביבה שאיתם תוכנית ה-Node.js הופעלה. כל ערך הוא מחרוזת או undefined, אז המירו מספרים וערכים בוליאניים בעצמכם ותנו לכל משתנה ברירת מחדל.
- קריאת קלט מהמשתמשב-Node.js אין פונקציה prompt(). כדי לשאול את המשתמש שאלה בטרמינל, צרו ממשק readline על process.stdin וקראו ל-question(), או חכו לו עם await דרך readline/promises.
קבצים ונתיבים
- fs.readFileקוראים קובץ ב-Node.js עם fs.readFile (callback), עם fs.readFileSync או עם await readFile מתוך fs/promises. העבירו 'utf8' כדי לקבל מחרוזת, וטפלו ב-ENOENT כשהקובץ חסר.
- fs.writeFileכותבים קובץ ב-Node.js עם fs.writeFile, עם fs.writeFileSync או עם await writeFile מתוך fs/promises. הקובץ נוצר אם הוא חסר ומוחלף אם הוא קיים; השתמשו ב-appendFile כדי להוסיף לסופו.
- fs/promisesfs/promises היא גרסת ה-promises של המודול fs ב-Node: readFile, writeFile, readdir, stat, mkdir, rm ו-rename מחזירות כולן promises שעושים להם await, ושגיאות נתפסות עם try/catch.
- המודול pathהמודול path בונה ומפרק נתיבי קבצים בדרך הנכונה למערכת ההפעלה. path.join מחבר קטעים זה לזה; path.resolve הופך אותם לנתיב מוחלט, החל מהתיקייה הנוכחית.
Node אסינכרוני
- Event Loopלולאת האירועים של Node.js מריצה את ה-callbacks שלכם בשלבים (timers, poll, check, close), ובין כל callback היא מרוקנת את תור ה-process.nextTick ואחריו את תור ה-promises. הריצו את הדוגמאות כדי לראות את הסדר המדויק.
- EventEmitterEventEmitter מהמודול events של Node מאפשר לאובייקט להכריז על אירועים עם שם בעזרת emit, ולקוד אחר להגיב בעזרת on או once. ה-listeners רצים באופן סינכרוני, לפי הסדר שבו הם נוספו.
HTTP ו-Express
- שרת HTTP`http.createServer()` מקבל פונקציה אחת שרצה לכל בקשה עם `req` ו-`res`. קוראים את ה-method וה-URL מתוך `req`, ואז מגדירים ב-`res` סטטוס, headers וגוף, וקוראים ל-`res.end()`.
- ניתוב ב-Expressroute ב-Express הוא method, נתיב ו-handler: `app.get('/users/:id', handler)`. קבצו routes קשורים ב-`express.Router()` וחברו אותו תחת prefix עם `app.use('/api', router)`.
- Middleware ב-Expressmiddleware ב-Express הוא פונקציה `(req, res, next)` שרצה לפני ה-route handler. הוא יכול לקרוא או לשנות את הבקשה, לסיים אותה עם תשובה, או לקרוא ל-`next()` כדי להעביר אותה הלאה.
- req.params, query, body`req.params` מחזיק את החלקים עם השם בנתיב (`/users/:id`), `req.query` את ה-query string (`?sort=new`), ו-`req.body` את גוף הבקשה אחרי פענוח, והוא `undefined` עד שמוסיפים body parser כמו `express.json()`.
- טיפול בשגיאותerror handler ב-Express הוא middleware עם ארבעה ארגומנטים, `(err, req, res, next)`, שנרשם אחרי ה-routes. Express 5 שולח אליו שגיאות שנזרקו, קריאות ל-`next(err)` ו-promises שנדחו מ-handlers אסינכרוניים.
- express.static`app.use(express.static(path.join(__dirname, 'public')))` מגיש כל קובץ בתיקייה `public` ב-URL המתאים: `public/style.css` עונה ל-`/style.css`. הוסיפו mount path כדי להגיש אותם תחת prefix.
- CORS ב-Expressשגיאת CORS אומרת שהדפדפן חסם דף מלקרוא את התשובה של ה-API שלכם, כי התשובה לא התירה את ה-origin של הדף. מתקנים את זה בשרת: שולחים `Access-Control-Allow-Origin` ועונים לבקשות preflight של `OPTIONS`, ידנית או עם החבילה `cors`.
נתונים ואימות
- MongoDBעובדים עם MongoDB מ-Node.js דרך ה-driver הרשמי mongodb: מתחברים עם MongoClient, ואז מוסיפים, מוצאים, מעדכנים ומוחקים documents ב-collection, הכל עם async/await.
- JWTJWT הוא token חתום משלושה חלקים ב-base64url ששרת מנפיק בהתחברות ובודק בכל בקשה. ב-Node.js חותמים ומאמתים אותו עם החבילה jose או jsonwebtoken ומפתח סודי.