شروع با Node.js

شروع با Node.js
برنامه نویسی Event-Driven یا رویدادمحور به سبک خاصی از برنامه نویسی گفته می‌شود که در آن روند اجرای برنامه توسط رویدادها تعیین می‌شود. Node.js  نیز یکی از زبان‌های برنامه‌نویسی است که طبق معماری رویداد محور عمل می‌کند.
 همین موضوع باعث شده تا یادگیری این زبان برای مبتدیان سخت باشد ولی سرعت اجرای بالا در node.js محبوبیت زیادی در میان برنامه‌نویسان دارد. در این مطلب برخی از اصول پایه‌ای node.js معرفی شده که شناخت بهتری را به کاربران می‌دهد.
دارالترجمه رسمی
دارالترجمه رسمی پارسیس شامل خدمات ترجمه رسمی و تخصصی در بیش از 60 زبان زنده دنیا
جای بروشور دیواری
خرید جای بروشور دیواری و رومیزی
افزونه های سئو وردپرس
بهترین افزونه های سئو وردپرس به صورت کاملا فارسی
تعمیر لوازم خانگی
تعمیر جاروبرقی، مایکروفر، بخارشوی، ظرفشویی، لباسشویی، سولاردام، کولرگازی
خودتان را اینجا معرفی کنید

معرفی

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

برنامه نویسی غیرهم زمان( Asynchronous Programming)

Node.js از معماری ماژول محور برای تولید اپلیکیشن های پیچیده استفاده می‌کند. هر عملکرد و تابعی در Node.js غیر همزمان است. در I/O ناهمگام، هیچ پروسه‌ای منتظر به پایان رسیدن پروسه‌های دیگر نمی‌ماند. بنابراین هر thread که در روند فعلی برنامه متوقف شود، در پس زمینه‌ی آن اجرا خواهد شد. این مهمترین ویژگی است که باید در مورد node.js  بدانید.
 به عنوان مثال زمانی که می‌خواهید فایلی را از میان فایل‌های سیستمی بخوانید،  باید یک تابع callback مشخص کنید که وقتی عمل خواندن به اتمام رسید، اجرا شود.

در Node.js انجام هر کاری به عهده شماست!

Node.js تنها یک محیط است و شما موظف هستید تمامی موارد را خودتان ذکر کنید.  همین موضوع باعث می‌شود تا کار با این محیط برای کاربران جدید دشوار و خسته کننده به نظر برسد. در ادامه  کدهای Node.js برای یک برنامه‌ی بسیار ساده را می‌بینید:
 
var i, a, b, c, max;

max = 1000000000;

var d = Date.now();

for (i = 0; i < max; i++) {
    a = 1234 + 5678 + i;
    b = 1234 * 5678 + i;
    c = 1234 / 2 + i;
}

console.log(Date.now() - d);

و معادل آن در PHP:
$a = null;
$b = null;
$c = null;
$i = null;
$max = 1000000000;
 
$start = microtime(true);
 
for ($i = 0; $i < $max; $i++) {
    $a = 1234 + 5678 + $i;
    $b = 1234 * 5678 + $i;
    $c = 1234 / 2 + $i;
}
 
var_dump(microtime(true) - $start);


جدول زیر این دو زبان را  از نظر زمان پاسخ‌دهی مقایسه می‌کند:

 
در تکرارهای پایین، PHP سریع‌تر عمل می‌کند اما با تکرارهای بالا به این نتیجه می‌رسیم که PHP 93% کندتر از Node.js است.

ماژول‌ها

Node.js از معماری ماژول برای ساخت برنامه‌ها استفاده می‌کند. ماژول‌ها همانند کتابخانه‌ها در زبان C و واحدها در زبان پاسکال هستند. هر ماژول شامل مجموعه ای از توابع مربوط به موضوع اصلی ماژول است.  به عنوان مثال ماژول http شامل توابع خاصی برای HTTP است. به منظور تسهیل دسترسی به فایل‌های سیستمی، ایجاد سرورهای HTTP و TCP/UDP و اجرای سایر توابع مفید، تعدادی ماژول‌ اصلی در node.js فراهم شده است.
با نوشتن تابع require() ماژول مورد نظر خود را فراخوانی می‌کنیم.
 مانند مثال زیر:
 

var http = require('http');


در کد بالا تابع  require() یک مرجع از ماژول http را در یک متغیرhttp  ذخیره می‌کند. با پاس دادن نام ماژول به تابع require() باعث می‌شود Node درون پوشه‌ی node_modules برنامه ما را جست‌وجو کند تا آن را پیدا کند. در صورتی که ماژول مورد نظر پیدا نشد، node  حافظه ماژول‌های سراسری را جستجو می‌کند.
می‌توانید یک فایل واقعی را با کمک  کد زیر مشخص کنید:
 

var myModule = require('./myModule.js');


ماژول‌ها تکه کدهای محصور شده هستد. اغلب کد درون یک ماژول خصوصی است به این معنی که توابع و متغیرهای درون آن تنها از داخل ماژول قابل دسترسی هستند. ماژول زیر را به عنوان مثال بررسی می‌کنیم:
 

var PI = Math.PI;

exports.area = function (r) {
  return PI * r * r;
};

exports.circumference = function (r) {
  return 2 * PI * r;
};


توسط این کد یک متغیر pi ایجاد می‌کنیم که فقط داخل همین ماژول دیده می‌شود و خارج از ماژول غیرقابل دسترسی است. در صورتیکه دو تابع موجود کنار شیء exports از خارج ماژول هم قابل دسترسی هستند. در واقع می‌توان گفت pi کاملا محافظت شده است.

نصب

به منظور نصب node.js روی سیستم عامل Windows یا MacOS به سایت nodejs.org مراجعه کنید و در صورتی که از سیستم عامل لینوکس استفاده می‌‌کنید با وارد کردن کد زیر در ترمینال این برنامه را نصب کنید:
 

sudo apt-get update
sudo apt-get install node


یا:
 

sudo aptitude update
sudo aptitude install node


به دلیل وجود Node.js در منابع sid، ممکن است لازم باشد که آن‌ها را به لیست منابع‌تان اضافه کنید:
 

sudo echo deb http://ftp.us.debian.org/debian/ sid main > /etc/apt/sources.list.


اما مراقب نصب بسته‌های sid در سیستم‌های قدیمی‌تر باشید. زیرا ممکن است به سیستم صدمه بزند. برای جلوگیری از این امر بعد از اتمام نصب node فایل /etc/apt/sources.list.d/sid.list را پاک کنید.

نصب ماژول‌های جدید

Node.js دارای یک سیستم مدیریت بسته به نام Node Package Manager (NPM) است که به طور خودکار همراه با node.js نصب می‌شود. NPM  برای نصب ماژول‌های جدید مورد استفاده قرار می‌گیرد. برای نصب یک ماژول ابتدا باید در قسمت command line  به پوشه مورد نظر خود رفته و دستور زیر را اجرا کنید:
 

npm install module_name


ایجاد برنامه‌ی معروف the hello world

در اولین برنامه‌ی node.js  ای که می‌نویسیم،  پیغام 'Hello World!' برای کنسول نمایش داده می‌شود. برای ظاهر شدن این پیغام ابتدا باید یک فایل به نام hello.js ایجاد کرده و کد زیر را وارد نمایید:
 

console.log('Hello World!');


حال نوبت به اجرای صفحه می‌رسد. ترمینال را باز می‌کنیم در قسمت command line به پوشه‌ای که hello.js  در آن قرار دارد می‌رویم و دستور زیر را اجرا می‌کنیم:
 

node hello.js


حالا می‌توانید پیغام 'Hello World!' را مشاهده کنید.

سرور HTTP

می‌خواهیم شما را با برنامه‌ای پیشرفته‌تر آشنا کنیم. در مرحله اول با کدهای زیر شروع می‌کنیم. ابتدا توضیح کنار هر کد و سپس توضیح کلی را بخوانید:

 

// Include http module.
var http = require("http");

// Create the server. Function passed as parameter is called on every request made.
// request variable holds all request parameters
// response variable allows you to do anything with response sent to the client.
http.createServer(function (request, response) {
	// Attach listener on end event.
	// This event is called when client sent all data and is waiting for response.
	request.on("end", function () {
		// Write headers to the response.
		// 200 is HTTP status code (this one means success)
		// Second parameter holds header fields in object
		// We are sending plain text, so Content-Type should be text/plain
		response.writeHead(200, {
			'Content-Type': 'text/plain'
		});
		// Send data and end response.
		response.end('Hello HTTP!');
	});
// Listen on the 8080 port.
}).listen(8080);


با استفاده از تابع response.write() می‌توانید اطلاعات بیشتری به کاربر بفرستید. البته باید این تابع را قبل از تابع response.end() فراخوانی کنید. این کد را به عنوان http.js ذخیره کرده و آن را در کنسول وارد کنید:
 

node http.js


با رفتن به آدرس http://localhost:8080 می‌توانید متن "Hello HTTP!" را در صفحه مشاهده کنید.

به کار بردن پارامترهای URL

همانطور که قبلا ذکر شد در Node انجام هرکاری به عهده شماست.
کد زیر رادنبال کنید:
 

// Include http module, 
var http = require("http"), 
// And url module, which is very helpful in parsing request parameters. 
	url = require("url"); 

// Create the server. 
http.createServer(function (request, response) { 
	// Attach listener on end event. 
	request.on('end', function () { 
		// Parse the request for arguments and store them in _get variable. 
		// This function parses the url from request and returns object representation. 
		var _get = url.parse(request.url, true).query; 
		// Write headers to the response. 
		response.writeHead(200, { 
			'Content-Type': 'text/plain' 
		}); 
		// Send data and end response. 
		response.end('Here is your data: ' + _get['data']); 
	}); 
// Listen on the 8080 port. 
}).listen(8080);


در کد داده شده تابع parse() از ماژول url، درخواست‌های URL را به یک شیء تبدیل می‌کند. url یکی از ماژول های اصلی node  است.

خواندن و نوشتن فایل‌ها

برای مدیریت فایل‌ها در node، از ماژول fs که یکی از ماژول‌های اصلی  node است استفاده می‌کنیم. با استفاده از توابع fs.readFile() و fs.writeFile() قادر به خواندن و نوشتن فایل‌ها خواهیم بود.
در ادامه مثالی از این توابع را مشاهده می‌کنید:
 

// include http module,
var http = require("http"),
// And mysql module you've just installed.
	fs = require("fs");

// Create the http server.
http.createServer(function (request, response) {
	// Attach listener on end event.
	request.on("end", function () {
		// Read the file.
		fs.readFile("test.txt", 'utf-8', function (error, data) {
			// Write headers.
			response.writeHead(200, {
				'Content-Type': 'text/plain'
			});
			// Increment the number obtained from file.
			data = parseInt(data) + 1;
			// Write incremented number to file.
			fs.writeFile('test.txt', data);
			// End response with some nice message.
			response.end('This page was refreshed ' + data + ' times!');
		});
	});
// Listen on the 8080 port.
}).listen(8080);


هربار که سرور یک درخواست دریافت می‌کند، اسکریپت یک شماره از فایل را می‌خواند،  سپس شماره‌ را یکی افزایش داده و در فایل می‌نویسد. تابع fs.readFile() سه آرگومان نام فایل، کدگذاری مورد انتظار و تابع   callback  را پذیراست. تابع fs.writeFile() نیز نام فایل و اطلاعات را به عنوان آرگومان می‌پذیرد.

دسترسی به پایگاه‌های داده MySQL

بیشتر تکنولوژی‌های سمت سرور قبلی دارای ابزار ارتباطی و پایگاه داده‌ی داخلی برای خود هستند. اما برای داشتن پایگاه داده در node.js  باید کتابخانه مربوطه را نصب کنید. کنسول خود را باز کنید و به جایی که صفحات را ذخیره کرده‌اید بروید و دستور زیر را اجرا کنید:
 

npm install mysql@2.0.0-alpha2


با زدن این دستور ماژول مورد نظر دانلود و نصب می‌شود. مثال زیر کاربرد این دستور را نشان می‌دهد:
 

// include http module, 
var http = require('http'), 
// And mysql module you've just installed. 
	mysql = require("mysql"); 
	 
// Create the connection. 
// Data is default to new mysql installation and should be changed according to your configuration. 
var connection = mysql.createConnection(
 { 
	user: "root", 
	password: "", 
	database: "db_name"
}); 

// Create the http server. 
http.createServer(function (request, response) { 
	// Attach listener on end event. 
	request.on('end', function () { 
		// Query the database. 
		connection.query('SELECT * FROM your_table;', function (error, rows, fields) { 
			response.writeHead(200, { 
				'Content-Type': 'x-application/json' 
			}); 
			// Send data as JSON string. 
			// Rows variable holds the result of the query. 
			response.end(JSON.stringify(rows)); 
		}); 
	}); 
// Listen on the 8080 port. 
}).listen(8080);


در این کد با وارد کردن رشته query و تابع callback، به راحتی می‌توانید از پایگاه داده پرس و جو کنید. در یک برنامه واقعی  ابتدا باید وجود پیغام‌های خطا را چک کنید.  سپس  پاسخ‌های مناسب را  بسته به مثبت یا منفی بودن جواب کوئری ارسال کنید. پارامتر rows دربردارنده نتیجه کوئری است.  با استفاده از تابع JSON.stringify()  می‌توانید اطلاعات  موجود در rows را به فرمت  JSON تبدیل کنید.
این فایل را به عنوان mysql.js ذخیره کرده و اجرا نمایید.  در آدرس http://localhost:8080 فایل‌ها با فرمت   JSON برایتان نمایش داده خواهد شد.

منبع: tutsplus
 

کارشناس فناوری اطلاعات، علاقمند به نوشتن در زمینه‌ی وب

نظرات و سوالات کاربران

ارسال پاسخ علی
علی
یکشنبه ۰۳ اردیبهشت ۱۳۹۶ ۲۱:۴۶
سلام
ممنونم
مفید بود
ارسال پاسخ محمود
محمود
چهارشنبه ۱۰ آذر ۱۳۹۵ ۲۱:۱۱
مقایسه بین php و نود در سرعت کمی نا عادلانست!
اولاً که به ورژن و نرم افزار و سخت افزار محیط تست اشاره نشده
HHVM هم از نود بالاتره راندمانش
php مود fpm داره cgi داره ...
همین یه زبان رو نمیشه مقایسه سرعت کرد
ارسال پاسخ رضا
رضا
سه شنبه ۰۹ آذر ۱۳۹۵ ۰۰:۴۶
جالب بود ، ممنون
ارسال پاسخ حسن
حسن
پنج شنبه ۰۴ آذر ۱۳۹۵ ۰۴:۲۱
خیلی ممنون و متشکر ، مقاله خوبی بود
ارسال پاسخ s@33d
s@33d
دوشنبه ۰۱ آذر ۱۳۹۵ ۱۶:۱۳
با تشکر مفید بود.