express.js – שימוש ב-API של ה-request

הסבר על איך משתמשים ב-API של הבקשה ב-express.
express.js

במאמר הקודם כיסינו את ה-middleware ברמת האפליקציה וגם הראינו איך משתמשים בארגומנטים ב-URL. במאמר הזה אנו נלמד איך משתמשים ב-API. המאמר הזה נכתב כאשר גרסת ה-API של express היא 4. אבל גם אם אתם קוראים את המאמר הזה בשלב יותר מאוחר, לא אמורה להיות בעיה משמעותית כיוון שאני מסביר כאן על העקרון של ה-API ולא על כל פונקציה ופונקציה.

ראשית, כל ה-API מרוכז באופן מאוד נוח באתר הרשמי של express, אני לא אעבור על כל ה-API אבל על חלקים רלוונטיים מתוכו. את ההסבר אני אדגים על ה-userLoggermiddleware שאותו הראיתי במאמר הקודם. בגדול, כך נראה ה-app.js שלנו שמופעל על ידי node app.js:


var express = require('express');
var app = express();
var help = require('./help');
var user = require('./user');

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});


app.use('/help', help);
app.use('/user', user);

אפשר לראות שיש לו שני ראוטרים: אחד המוקדש ל-help/X והשני מוקדש ל user/X. הראוטר של user/X נקרא user.js:


var express = require('express');
var router = express.Router();
var userLogger = require('./userLogger');

// using the middleware
router.use('/:id',userLogger);

router.get('/:id', function(req, res) {
  res.send('User ' + req.params.id + ' entered the system');
});

module.exports = router;


הראוטר משתמש ב-middleware של userLogger.js – כך הוא נראה:


var userLogger = function (req, res, next) {
  console.log('User ID used ' + req.params.id);
  next();
};

module.exports = userLogger;

אז בואו ונתחיל, אם אני נכנס ל-URL ומוסיף פרמטרים, כמו למשל http://localhost:3000/user/abu%20lele?param1=aaaa&param2=bbbb – איך אני יכול לקבל את הפרמטרים? באופן מאוד פשוט:


var userLogger = function (req, res, next) {
  console.log(req.query);
  next();
};

module.exports = userLogger;

אם אני אסתכל על הקונסולה, אני אראה:


{ param1: 'aaaa', param2: 'bbbb' }

מאיפה ידעתי שיש תכונה של query ב-request? לא משמים אלא מה-API שמתעד את כל התכונות של ה-request, שם אני רואה שיש תכונת query. ה-request הזה זמין בכל מקום: גם בראוטר, גם ב-middleware וגם ב-app עצמו. איפה שיש request, אני יכול לקבל גישה לתכונות שלו. כמובן שחלקן ישתנו עם הקונטקסט, למשל, אם אני אבדוק את ה-path, ב-app אני אקבל את ה-path המלא אבל ב-router (או ב-middleware של ראוטר) אני אקבל את ה-path היחסי לראוטר.

אם למשל אני משתמש ב-middleware כזה:


var userLogger = function (req, res, next) {
  console.log('path is ' + req.path);
  next();
};

module.exports = userLogger;

תפקידו הוא להדפיס את req.path לקונסולה.

אני משתמש בו ב-app.js


var express = require('express');
var app = express();
var help = require('./help');
var user = require('./user');
var userLogger = require('./userLogger');


app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

// using the middleware
app.use(userLogger);

app.use('/help', help);
app.use('/user', user);

וגם בראוטר user.js:


var express = require('express');
var router = express.Router();
var userLogger = require('./userLogger');

// using the middleware
router.use(userLogger);

router.get('/:id', function(req, res) {
  res.send('User ' + req.params.id + ' entered the system');
});

module.exports = router;

ואני נכנס ל http://localhost:3000/user/abu lele – אז מה לפי דעתכם אקבל בלוג? התשובה היא:


path is /user/abu%20lele
path is /abu%20lele

למה? כי בפעם הראשונה, בקונטקסט של ה-app, הקונטקסט הראשי, אני אקבל את ה-path המלא. בקונטקסט השני, של הראוטר, אני אקבל את ה-path המלא יחסית לראוטר. שהוא user. שימו לב לזה בפעם הבאה שאי קונסיסטנטיות מטריפה אתכם.

יש כמה וכמה תכונות שימושיות ומומלץ להסתכל ב-API כדי לראות את כולן. אפשר גם להדפיס לקונסולה את אובייקט ה-request כדי להציץ.

אין המון מתודות ל-request. המתודה החשובה והעיקרית היא accept שבודקת את ה-headers של הבקשה, הנה דוגמה ליישום שימושי – אצור middleware בשם headerCheckerשירוץ מה-app (כלומר הוא ירוץ על כל הנתיבים). להזכירכם, כך middleware שרץ מה-app נראה. אני קורא ל-headerChecker.js עם ה-require ואז משתמש ב app.use כדי להפעילו:


var express = require('express');
var app = express();
var help = require('./help');
var user = require('./user');
var headerChecker = require('./headerChecker');

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

// using the middleware
app.use(headerChecker);

app.use('/help', help);
app.use('/user', user);

headerChecker.js נראה כך:


var headerChecker = function (req, res, next) {

  // the order of this list is significant; should be server preferred order
  switch(req.accepts()) {
    case 'json':
      res.setHeader('Content-Type', 'application/json')
      break;
    case 'html':
      res.setHeader('Content-Type', 'text/html')
      break;
    default:
      // the fallback is text/plain, so no need to specify it above
      res.setHeader('Content-Type', 'text/plain')
      break
  }

  next();
};

module.exports = headerChecker;

המתודה accept בודקת את ה-Accept HTTP header field של הבקשה ומחזירה טקסט שהוא הדבר הכי תואם לבקשה. כך למשל, אם ה-Accept HTTP header field של הבקשה
הוא text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, המתודה תחזיר html. במקרה הזה, אני קובע את ה-header של התשובה בהתאם ל-header של הבקשה. את זה אני עושה עם מתודה שנקראת setHeader שהיא מתודה של התשובה, ה-res או ה-response. ועל ה-API של ה-response נדבר במאמר הבא.

פוסטים נוספים שכדאי לקרוא

פתרונות ומאמרים על פיתוח אינטרנט

יישום של nonce על מנת להגן מפני התקפות injection

בפוסט הקודם הסברתי על hash עם CSP על משאבי inline – שזה נחמד ומעולה אבל פחות ישים בעולם האמיתי שבו בדרך כלל התוכן ה-inline (בין

פייתון

קבצי קונפיגורציה בפואטרי

הגדרות שמשנות את ההתנהגות של פואטרי באמצעות קבצי הגדרות גלובליים, לוקליים ואפילו משתני סביבה.

גלילה לראש העמוד