ماژول Http و ماژول Url در NodeJs

نویسنده پوریا ستایش پوریا ستایش
1399/04/30
0
112
زمان مطالعه 6 دقیقه
ماژول Http و ماژول Url در NodeJs
در مقاله قبلی در مورد ماژول‌ها در Node.Js به‌صورت کلی صحبت کردیم. در این قسمت به‌صورت اختصاصی به بررسی ماژول Http و ماژول Url در Node.Js خواهیم پرداخت.

برای دیدن مشخصات دوره روی «سرفصل های دوره NodeJs» کلیک بفرمایید.

ماژول Http در Node.Js

در یک جمله، ماژول Http اجازه می‌دهد که اطلاعات از طریق پروتکل Http انتقال یابد.

برای افزودن این ماژول به فایل جاوا اسکریپتی به‌صورت زیر عمل می‌کنیم.

var http = require('http');

همان‌طور که در مقاله قبلی کمی با ماژول Http آشنا شدید، برای ایجاد یک وب سرور استفاده می‌شود. یک پورتی (port) برای اجرا در نظر گرفته می‌شود و پاسخ «Response» به سمت کاربر ارسال می‌شود.

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

var http = require('http');

http.createServer(function (req, res) {
  res.write('Hello World!'); //write a response to the client
  res.end();
}).listen(8080); //the server object listens on port 8080

تابعی (function) که به createServer پاس داده شده است؛ اگر هر کاربری در هر زمانی درخواست ارسال کند، اطلاعات در پورت ۸۰۸۰ قابل بررسی است.

شما می‌توانید دستور بالا را در فایلی به اسم server.js ذخیره کنید و به‌وسیله‌ی دستور زیر آن را اجرا کنید.

node server.js

اگر مراحل را به‌درستی طی کرده باشید در آدرس localhost:8080، عبارت Hello World را خواهید دید.

افزودن HttpHeader به پاسخ سرور Node.Js

اگر می‌خواهید فایل Html را برای کاربر برگردانید، باید در Header هر پاسخ، به مرورگر اعلام کنید که این پاسخ یک پاسخ از جنس text/html است. در واقع content-type از نوع text/html است.

Text/html نوع mime برای فایل‌های html است.

Mime type چیست؟

Mime type یک برچسب است که برای مشخص کردن نوع فایل استفاده می‌شود. این برچسب به نرم افزارها اعلام می‌کند که چگونه با فایل‌ها برخورد داشته باشند. در اینجا نرم افزار مورد نظر ما مرورگر است.

از معروف‌ترین نوع‌ها می‌توان به موارد زیر اشاره کرد:

  • text/html برای فایل‌های html
  • video/mp4 برای فایل‌های ویدئویی با فرمت mp4
  • text/plain برای فایل‌هایی با فرمت txt
  • و مواردی از این دست که تعدادشان زیاد است.

به ادامه بحث برگردیم، برای افزودن httpheader به پاسخ سرور در Node.JS، در اولین آرگومان از res.writeHead باید کد وضعیت «Status Code» را برای اطلاع مرورگر ارسال نمایید. کد پاسخ صحیح و کامل عدد ۲۰۰ است. آرگومان بعدی، یک شیء است که شامل اطلاعات  header می‌شود.  به مثال زیر توجه کنید:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write('Hello World!');
  res.end();
}).listen(8080);

Query String چیست؟

قبل از اینکه به‌عنوان بعدی رسیدگی کنیم باید با query string آشنا شویم، در جهان وب، query string بخشی از یک url است. به‌طور معمول یک query string، فرم html است که مقادیر input آن با درخواست get به سمت سرور ارسال شده است.

فرم زیر را در نظر بگیرید:

<form action="register.php" method="get">
    <input type="text" name="username" />
    <input type="password" name="password" />
    <input type="submit" value="Submit" />
</form>

با فشردن دکمه submit این فرم اطلاعات که شامل username و password است به‌صورت query string  به سمت صفحه register.php ارسال می‌شود. در واقع به آدرس زیر:

/register.php?username=ali&password=1234

به قسمتی که بعد از علامت سؤال(?) نوشته شده است، Query String گفته می‌شود.

query string در NodeJs به چه معناست

هر فیلد ورودی (input) دارای یک name است که در query string، با همان name قابل شناسایی است.  در مثال‌های بالا username و password را دیدیم.

خواندن Query String در سرور Node.Js

تابعی که به createServer پاس داده می‌شود شامل یک req یا به‌طور کامل request است که درخواستی که از سمت کاربر دریافت می‌شود را شامل می‌شود.

این شیء یک پراپرتی دارد به اسم url که بخشی از url را که بعد از نام دامنه است در خود نگه می‌دارد. به مثال زیر توجه کنید:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.write(req.url);
  res.end();
}).listen(8080);

حال که مثال بالا را تمرین کردید، بعد از اجرا به‌وسیله دستور node server.js آدرس‌های مختلفی در مرورگر وارد کنید. به مثال‌های زیر توجه کنید:

http://localhost:8080/summer
http://localhost:8080/winter

خروجی لینک‌های بالا باید به ترتیب summer و winter باشد.

ماژول Url

ماژول دیگری در Node.Js وجود دارد به نام ماژول Url که به‌وسیله آن می‌توانیم آدرس یا به‌صورت صحیح Url را به قسمت‌های قابل خواندن تقسیم کنیم.

برای استفاده از این ماژول باید آن را ابتدا به سند جاوا اسکریپت بیفزاییم. پس داریم:

var url = require('url');

به‌وسیله ماژول Url به مواردی مثل host، parse،pathname ، search، query و ... دسترسی خواهیم داشت.

فرض کنید آدرسی مثل عبارت زیر داریم و قصد تجزیه آن به‌وسیله ماژول Url را داشته باشیم.

localhost:8080/index.html?year=2020&month=july

Host در ماژول url نام دامنه را برای ما بر می‌گرداند. مثل localhost:8080

Pathname در ماژول Url، query string و نام دامنه را حذف کرده و صفحه اصلی را بر می‌گرداند. در این مثال index.html به‌عنوان pathname در نظر گرفته می‌شود.

برای به دست آوردن query string از پراپرتی search در ماژول Url استفاده می‌کنیم.

اگر خواهان query به‌صورت یک شیء (object) هستید، پراپرتی «query» به شما پیشنهاد می‌شود.

برای استفاده از این ماژول، url باید تجزیه «parse» شود. بعد از استفاده از این پراپرتی از ماژول url، مجموعه پراپرتی‌های بالا در دسترس خواهد بود. به مثال زیر و به کامنت‌های نوشته شده جلوی هر پراپرتی توجه کنید:

var url = require('url');
var adr = 'http://localhost:8080/index.html?year=2020&month=july';
var q = url.parse(adr, true);

console.log(q.host); //returns 'localhost:8080'
console.log(q.pathname); //returns '/index.html'
console.log(q.search); //returns '?year=2020&month=july'

var qdata = q.query; //returns an object: { year: 2020, month: 'july' }
console.log(qdata.month); //returns 'july'

تجزیه Query String در سرور Node.Js

می‌توانیم بعد از افزودن ماژول Url در سرور، مثالی را بررسی کنیم. به کد زیر توجه کنید:

var url = require('url');

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  var q = url.parse(req.url, true).query;
  var txt = q.year + " " + q.month;
  res.end(txt);
}).listen(8080);

بعد از ذخیره و اجرای فایل server.js عبارت زیر را در مرورگر وارد کنید:

http://localhost:8080/?year=2020&month=July

خروجی باید چیزی شبیه به عبارت زیر باشید (نمایش سال و  ماهی که در Url وارد کردید):

2020 July

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

اگر سؤال یا مشکلی در این زمینه دارید، خوشحال می‌شویم در قسمت نظرات مطرح کنید.