تخفیف ویژه

آشنایی با Routing در Express

دسته بندی: آموزش
زمان مطالعه: 6 دقیقه
۱۷ آذر ۱۳۹۷

آشنایی با Routing در Expressدر این مطلب قصد دارم کار با Routing در Express رو بهتون آموزش بدم و کاربرد و نحوه استفاده از اون رو براتون توضیح بدم.

مشخص کردن مسیرها یا Routing در Express، فرآیندی هست که مشخص میکنه وقتی یک URL فراخوانی میشه، چه اتفاقی باید بیوفته و یا اینکه چه قسمتی از Application باید به Request مورد نظر پاسخ بده و اون رو مدیریت کنه.

سینتکس تعریف کردن Routing در Express بصورت زیر هست:

app.method(path, handler);

شما به جای method باید یکی از انواع مختلف درخواست HTTP رو قرار بدین. همونطور که میدونین انواع مختلفی برای درخواست HTTP وجود داره که عبارتند از get, post, put, head, delete, options, trace, copy, lock, move, purge, patch و ...

یک method در Express بنام all اضافه شده است که به درخواست با هر نوعی که باشه، پاسخ میده و برای اون فرقی نداره.

شما میتونین بصورت همزمان برای یک path از متدهای مختلفی استفاده کنید، و این مسیرها مستقل هستند و request‌های مربوط به خودشون رو مدیریت میکنند و conflict با هم ندارند.

path همون مسیری هست که میخوایم وقتی request به اون ارسال شد، این route اون رو مدیریت کنه. Handler هم یک callback هست و زمانی اجرا میشه که درخواست مورد نظر با method و path مسیر ما مطابقت داشته باشه و با هم match بشن.

مثال زیر رو ببینید:

const express = require('express');
const app = express();

app.get('/hello', (req, res) => {
  res.send("Hello World!");
});

app.listen(3000, () => {
  console.log('App started on port 3000 ...');
});

کدهای بالا رو در فایل app.js ذخیره کنید.

همونطور که میبینید در ابتدا express رو وارد پروژه کردیم و اون رو فراخوانی کرده و در متغیر app قرار دادیم. حالا میتونیم برای app یک route تعریف کنیم. در بالا یک route از نوع GET برای مسیر /hello تعریف شده و این مسیر متن Hello World رو به سمت کلاینت برگشت میده.

هر callback در مسیرها سه ورودی req و res و next رو میگیره و هر کدام کار خاصی رو انجام میدن. req اطلاعاتی رو در مورد request در اختیارمون قرار میده و با استفاده از res نیز میتونیم response مورد نظر رو برای کاربر ارسال کنیم و متد next هم برای مواقعی هست که چند callback داشته باشیم و زمانی که از next استفاده میکنیم، برنامه به callback بعدی و کدهای اون رو اجرا میکنه.

حالا اگر دستور node app.js رو در command line اجرا کنید و در مرورگر وارد آدرس localhost:3000/hello بشید، خروجی بصورت زیر خواهد بود:

شما همزمان میتونین در کنار متد get یک متد post هم برای مسیر /hello تعریف کنید و این route تنها زمانی فراخوانی میشه که url مورد نظر /hello باشه و متد اون نیز از نوع post باشه. بصورت زیر:

const express = require('express');
const app = express();

app.get('/hello', (req, res) => {
  res.send("Hello World!");
});

app.post('/hello', (req, res) => {
  res.send("You just called the post method at '/hello'!");
});

app.listen(3000, () => {
  console.log('App started on port 3000 ...');
});

برای اینکه یک درخواست از نوع post بدید، یا باید از curl در command line استفاده کنید و یا ابزارهایی که وجود داره مانند postman بهره ببرید. من در اینجا از postman استفاده میکنم و یک درخواست از نوع POST به مسیر /hello ارسال میکنم:post request with postman

همونطور که میبینید چون درخواست POST به مسیر مورد نظر ارسال کردیم، پس اون callback ای که مربوط به متد post بود فراخوانی میشه و متن مورد نظر برای کلاینت که ما هستیم، ارسال میشه.

اگر قصد دارید متدی بنویسید که به همه متدهای HTTP بصورت همزمان پاسخ بده، میتونین از متد all استفاده کنید. بصورت زیر:

app.all('/test', function(req, res){
  res.send("Response to all request to path test!");
});

استفاده از Regular expression برای مشخص کردن مسیر

شما میتونین با استفاده از Regular expression یک Route رو تعریف کنید که با هر مسیری که با این الگو مطابقت داشته باشه، اجرا و فراخوانی بشه. مثال زیر رو ببینید:

app.get(/post/, (req, res) => { /* */ })

این Route با مسیرهای /post و /post/first و /thepost و /posting/something و ... تطابق پیدا میکنه.

دسترسی به اطلاعات request در مسیر

فرض کنید که شما میخواید از سمت کلاینت اطلاعاتی رو برای سرور ارسال کنید. اگر از متد GET استفاده میکنید که باید در query string این موارد رو قرار بدین و اگر از متد post استفاده میکنید، باید این اطلاعات رو در بدنه درخواستتون قرار بدین و برای سرور ارسال کنید. برای متد get میتونین بصورت زیر به query string‌ها دسترسی داشته باشید:

app.get('/hello', (req, res) => {
  const {
    name,
  } = req.query;

  res.send(`Hello ${name}`);
});

همونطور که میبینید میتونیم اطلاعات مورد نظر رو از req.query بخونیم. در کد بالا name رو خوندیم و برای اون نام سلام فرستادیم. پس اگر یک درخواست از نوع get به localhost:3000/hello?name=Mohammad ارسال کنیم، در خروجی Hello Mohammad رو خواهیم دید.

برای متد POST و PUT و DELETE و ... که اطلاعاتی رو در بدنه خودشون قرار میدن، دسترسی به اطلاعات کمی فرق داره. بهتره که در ابتدا یک ماژول بنام body-parser رو بصورت npm i --save body-parser نصب کنید و اون رو وارد پروژتون کنید و مثل یک middleware از اون استفاده کنید.

بعد از استفاده از این middleware اطلاعاتی که در بدنه درخواست post به سمت سرور ارسال میشه رو میتونین در req.body بخونید. بصورت زیر:

const express = require('express');
const bodyParser = require('body-parser');

const app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.post('/hello', (req, res) => {
  const {
    name,
  } = req.body;

  res.send(`Hello ${name}`);
});

app.listen(3000, () => {
  console.log('App started on port 3000 ...');
});

حالا اگر در postman یک درخواست POST بدیم و name رو در بدنه اون قرار بدین، سرور به ما سلام میگه. بصورت زیر:

Named parameters

فرض کنید که بخوایم یک Route سفارشی درست کنیم و نمیخوایم اطلاعات رو در query-string تعریف کنیم و میخوایم اطلاعات رو در URL قرار بدیم. برای اینکار میتونیم از پارامترهای نامگذاری شده استفاده کنیم. بصورت زیر:

app.get('/hello/:firstName/:lastName', (req, res) => {
  const {
    firstName,
    lastName,
  } = req.params;

  res.send(`Hello ${firstName} ${lastName}`);
});

حالا اگر در مرورگر آدرس localhost:3000/hello/mohammad/esfandiari رو وارد کنیم، خروجی Hello mohammad esfandiari رو مشاهده خواهیم کرد. میبینید که با استفاده از req.params میتونیم به پارامترهای نامگذاری شده، دسترسی پیدا کنیم.

استفاده از Router در Express

مدیریت کردن مسیرها بصورت بالا کمی گیج کننده هست و خوانایی و نظم کدها رو پایین میاره. برای اینکه مسیرها رو در فایلهای مستقل و جدا تعریف کنیم، میتونیم از Express.Router استفاده کنیم. یک پوشه بنام routes میسازیم و یک فایل بنام hello.js درون اون ساخته و کدهای زیر رو در اون قرار میدیم:

const express = require('express');

const router = express.Router();

router.get('/', function(req, res){
   res.send('GET route on hello.');
});

router.post('/', function(req, res){
   res.send('POST route on hello.');
});

// export this router to use in our index.js
module.exports = router;

حالا میتونیم این فایل و همه مسیرهای تعریف شده در اون رو در app.js وارد کرده و ازشون استفاده کنیم. بصورت زیر:

const express = require('express');

const hello = require('./routes/hello');

const app = express();

app.use('/hello', hello);

app.listen(3000, () => {
  console.log('App started on port 3000 ...');
});

به همین راحتی. با این روش مسیرهای مربوط به هم در فایلهای جداگانه قرار میگیرن و نظم پروژه ما بیشتر از قبل خواهد شد و بهتر میتونیم اونا رو مدیریت کنیم.

برای مطالعه بیشتر در مورد Routing در Express میتونین این لینک رو ببینید.

چه امتیازی به این مقاله می دید؟
نویسنده محمد اسفندیاری
بسیار به طراحی وب علاقمندم و به سرعت در حال یادگیری تمام مباحث پیشرفته هستم و دوست دارم که به دیگران هم یاد بدهم.

نظرات کاربران

اولین دیدگاه این پست رو تو بنویس !

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :