در مقالهی Node.js چیست؟ با Node.js و کاربردهای آن آشنا شدیم. Node.js یک پلتفرم سمت سرور مبتنی بر موتور جاوا اسکریپت گوگل کروم (V8 Engine) است و تمام چیزهایی را که برای اجرای یک برنامهی نوشته شده به زبان جاوا اسکریپت نیاز داریم، برایمان فراهم میکند. علاوه بر آن، با کمک Node.js زبان برنامه نویسی جاوا اسکریپت به جای اجرا در مرورگر در محیط سرور اجرا میشود. پس Node.js به ما اجازه میدهد به آسانی و سادگی برنامههای تحت شبکه مقیاسپذیر و بزرگ بنویسیم. در مقالهی آموزش نصب Node.js در ویندوز مراحل نصب را به صورت تصویری و گام به گام توضیح دادیم. حال قصد داریم تا در این مقاله به صورت جامع به آموزش Node.js بپردازیم.
برای شروع آموزش Node.js، یک فایل جاوا اسکریپت با نام hello.js ساخته و کد زیر را درون آن بنویسید:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.end('Hello World!');
}).listen(8080);
این کد پیام Hello World را برای هر مرورگر و یا کامپیوتری که از طریق پورت 8080 با کامپیوتر شما در ارتباط است، نمایش میدهد. برای اجرای این کد، باید یک خط فرمان یا command line را روی سیستم عامل خود اجرا کنید. چگونگی اجرای خط فرمان بسته به هر سیستم عاملی متفاوت است. برای سیستم عاملهای ویندوز این روشها عبارتند از:
در ویندوز xp: روی دکمهی start کلیک کرده و دکمهی Run را بزنید. cmd را تایپ و Enter بزنید.
در تمامی ویندوزها: دکمهی win از کیبورد را گرفته و R را بزنید.
در ویندوز ویستا، 7 و ۸ به بالا: در یک جای خالی داخل یک پوشه، دکمهی shift را بگیرید و کلیک راست کنید و گزینهی Open command windows here را بزنید.
در ویندوز ۱۰: دکمهی Start (گوشهی پایین سمت چپ دسکتاپ) را بزنید. سپس عبارت cmd را تایپ کنید. در بالای منو cmd ظاهر میشود. روی آن کلیک کنید تا باز شود.)
در تمامی ویندوزهای قبل از ۸: از مسیر زیر Command Prompt را انتخاب کنید. start > All Programs > Accessories > Command Prompt
پاورشل نیز یک خط فرمان محسوب میشود که با سرچ در ویندوز و یا در زیر منوی فایل در هر پوشهای دیده میشود.
معادل cmd در لینوکس ترمینال (Terminal) است. برای باز کردن ترمینال در لینوکسهایی مانند Ubuntu و Mint کافی است دکمهی ctrl+alt+t را فشار دهید، و یا کلمه Terminal را در آنها جستجو کنید. در Opensuse علاوه بر روش گفته شده، میتوانید کلید F4 را فشار دهید تا یک konsole باز شود.
بعد از باز کردن command line، با استفاده از فرمان cd به پوشهای بروید که فایل جاوا اسکریپت در آن قرار دارد. سپس دستور زیر را وارد کنید:
C:\Users\Your Name>node hello.js
با اجرای این دستور، کامپیوتر شما به یک سرور تبدیل میشود. برای اطمینان از درستی این عملکرد، میتوانید مرورگر خود را باز کرده و آدرس https://localhost:8080 را وارد کنید.
ماژولها همانند کتابخانهها در زبان جاوا اسکریپت هستند. هر ماژول شامل مجموعه توابعی است که میخواهید از آنها در برنامهی خود استفاده کنید. Node.js دارای ماژولهای زیادی است که بدون نیاز به نصب میتوانید از آنها کمک بگیرید. برای مشاهدهی این ماژولها، میتوانید به لیست ماژولهای built-in مراجعه کنید. برخی از ماژولهای محبوب در Node.js عبارتند از:
ماژول Express.js: یک وب فریم ورک سمت سرور برای محیط اجرایی Node.js است که به صورت رایگان و متن باز (Open Source) ارائه شده است.
ماژول MongoDB: به عنوان پایگاه دادهی NoSQL و چند سکویی به کار میرود. برای شروع کار با آن میتوانید مقالهی mongodb چیست؟ کاربردها و ویژگیهای پایگاه داده مونگو دیبی را مطالعه کنید.
ماژول Socket.io: ارتباطات دوطرفه را بهبود میدهد و مناسب برنامههای چت محور است. در مقالهی socket.io چیست؟ آشنایی با کتابخانه محبوب جاوا اسکریپت به طور مفصل درمورد آن صحبت کردهایم.
برای استفاده از یک ماژول باید از تابع require به صورت زیر استفاده کنید:
var http = require('http');
نام ماژول در درون پرانتز require قرار میگیرد. در مثال بخش قبل، از ماژول http برای راهاندازی یک سرور در کامپیوتر خود استفاده کردید.
علاوه بر ماژولهای از پیش آماده، میتوانید یک ماژول را به صورت دستی ایجاد کرده و به راحتی آن را در برنامههای خود بگنجانید. برای مثال کد زیر یک ماژول را ایجاد میکند که کار آن برگرداندن تاریخ و زمان کنونی است:
exports.myDateTime = function () {
return Date();
};
برای اینکه ویژگیها و توابع موجود در ماژول خارج از فایل ماژول نیز در دسترس باشند، از عبارت export استفاده میشود.
شاید برای شما این سوال ایجاد شود که تفاوت پکیج با ماژول در چیست؟
یک پکیج در Node.js، شامل تمام فایلهایی است که یک ماژول برای اجرا به آن نیاز دارد. به همین دلیل در بسیاری از موارد، این دو مفهوم را مشابه با یکدیگر میدانند. در مقالات قبلی، هنگام توضیح نصب Node.js گفتیم که npm یک ابزار مدیریت پکیج و حتی ماژول میباشد. npm هزاران پکیج را به صورت رایگان در اختیار کاربران قرار میدهد و به صورت خودکار هنگام نصب Node.js، بر سیستم شما نصب میشود.
برای دانلود و استفاده از یک پکیج در Node.js، کافی است تا در cmd، دستور npm install را قبل از نام پکیج مورد نظر بنویسید:
npm install packageName
برای استفاده از پکیج میتوانید از تابع require استفاده کنید که در بخش قبل آموزش Node.js توضیح دادیم.
هر عملی در کامپیوتر شما از طریق توابع انجام میشود. برای مثال هنگامی که یک فایل را باز میکنید و یا کانکشنی برقرار میکنید، یک تابع صدا زده میشود که باعث انجام عمل مورد نظر میشود. آبجکتها در Node.js میتوانند یک تابع را فراخوانی کنند. برای مثال در کد زیر، آبجکت rs یک تابع را برای باز کردن فایل فراخوانی میکند:
var fs = require('fs');
var rs = fs.createReadStream('./demofile.txt');
rs.on('open', function () {
console.log('The file is open');
});
Node.js یک ماژول داخلی به نام "Events" دارد که به وسیلهی آن میتوانید با توابع کار کنید. برای استفاده از این ماژول، ابتدا با require آن را وارد کرده و سپس یک آبجکت EventEmitter را به صورت زیر بسازید:
var events = require('events');
var eventEmitter = new events.EventEmitter();
با این آبجکت ساخته شده، میتوانید به راحتی توابع (حتی آنهایی که خودتان نوشتهاید) را فراخوانی کنید. برای فراخوانی از تابع emit استفاده کنید. برای نمونه در کد زیر داریم:
var events = require('events');
var eventEmitter = new events.EventEmitter();
//Create an event handler:
var myEventHandler = function () {
console.log('I hear a scream!');
}
//Assign the event handler to an event:
eventEmitter.on('scream', myEventHandler);
//Fire the 'scream' event:
eventEmitter.emit('scream');
برای شروع کار با فایل در آموزش Node.js، ماژول آدرس یا همان url را اضافه کنید:
var url= require('url');
سپس آدرس مورد نظر خود را در یک متغیر ذخیره کرده و با تابع url.parse آن را به یک آبجکت آدرس تبدیل کنید. در ادامه کد زیر را بنویسید:
var adr = 'https://localhost:8080/default.htm?year=2017&month=february';
var q = url.parse(adr, true);
console.log(q.host); //returns 'localhost:8080'
console.log(q.pathname); //returns '/default.htm'
console.log(q.search); //returns '?year=2017&month=february'
var qdata = q.query; //returns an object: { year: 2017, month: 'february' }
console.log(qdata.month); //returns 'february'
همانطور که در کد بالا میبینید، بخشهای مختلف آدرس در متغیر q قابل دسترسی هستند و میتوانید از آنها در برنامهی خود استفاده کنید.
ماژول سیستم فایل Node.js به شما این امکان را میدهد که با سیستم پروندهای روی کامپیوتر خود کار کنید. برای استفاده از این ماژول، از تابع require با ورودی fs استفاده کنید:
var fs = require('fs');
ماژول فایل سیستم برای موارد زیر به کار میرود:
خواندن فایل
ایجاد فایل
ویرایش فایل
حذف فایل
تغییر نام فایل
در ادامه توابع مربوط به هر یک از این موارد را بررسی میکنیم.
فرض کنید که یک فایل html با نام test به صورت زیر دارید:
<html>
<body>
<h1>My Header</h1>
<p>My paragraph.</p>
</body>
</html>
برای اینکه در کد بخش قبل، به جای پیام Hello World این فایل نمایش داده شود، باید فایل جاوا اسکریپت را به صورت زیر تغییر دهید:
var http = require('http');
var fs = require('fs');
http.createServer(function (req, res) {
fs.readFile('demofile1.html', function(err, data) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write(data);
return res.end();
});
}).listen(8080);
اگر کد خود را با دستور node اجرا کنید، صفحهی html را در آدرس لوکال سرور خود مشاهده خواهید کرد.
ماژول فایل سیستم دارای سه تابع اصلی برای ساخت فایل و نوشتن در آن است. این توابع عبارتند از:
تابع ()fs.appendFile
تابع ()fs.open
تابع ()fs.writeFile
اگر فایل در دایرکتوری پروژه وجود نداشته باشد، تابع ()appendFile به صورت خودکار آن را میسازد و محتوای مورد نظر را به فایل شما اضافه میکند:
var fs = require('fs');
fs.appendFile('mynewfile1.txt', 'Hello content!', function (err) {
if (err) throw err;
console.log('Saved!');
});
تابع ()open یک آرگومان ورودی دیگر دریافت میکند. این ورودی مشخص میکند که فایل در چه حالتی باز شود. برای مثال کد زیر فایل را در حالت writing باز میکند:
var fs = require('fs');
fs.open('mynewfile2.txt', 'w', function (err, file) {
if (err) throw err;
console.log('Saved!');
});
تابع ()writeFile کار دو تابع قبل را به صورت یکجا انجام میدهد. برای مثال داریم:
var fs = require('fs');
fs.writeFile('mynewfile3.txt', 'Hello content!', function (err) {
if (err) throw err;
console.log('Saved!');
});
برای ویرایش یک فایل و یا نوشتن متن درون آن، میتوانید از توابع زیر، به همان طریقی که در بخش قبل معرفی شدهاند، استفاده کنید:
تابع ()appendFile
تابع ()writeFile
برای حذف یک فایل کافی است تا از تابع ()unlink به شکل زیر استفاده کنید:
var fs = require('fs');
fs.unlink('mynewfile2.txt', function (err) {
if (err) throw err;
console.log('File deleted!');
});
برای تغییر نام یک فایل نیز به سادگی میتوانید تابع ()rename را به کار ببرید:
var fs = require('fs');
fs.rename('mynewfile1.txt', 'myrenamedfile.txt', function (err) {
if (err) throw err;
console.log('File Renamed!');
});
روشهای مختلفی برای پایان دادن یک برنامهی Node.js وجود دارد. در ادامه چهار روش کلی برای این کار را معرفی میکنیم.
سادهترین روش، گرفتن کلیدهای ctrl+c در خط فرمان یا همان کنسول است. این روش دستی است و اگر میخواهید عملیات توقف به صورت خودکار انجام شود، باید به سراغ سه روش بعدی بروید.
ماژول مرکزی process یک روش کارآمد به صورت زیر ارائه کرده است که امکان خروج از برنامهی Node.js را ارائه میکند:
process.exit()
هنگامی که Node.js این خط را اجرا میکند، پردازش مربوطه بلافاصله مجبور به توقف میشود. یعنی هر عملی که در حالت انتظار باشد، هر درخواست مربوط شبکه که در حال ارسال باشد و یا هر دسترسی به فایل سیستم، بدون هیچ استثنایی خاتمه مییابد. در این روش میتوانید یک عدد صحیح را به عنوان ورودی تابع ارسال کنید که کد خروج را به سیستم عامل میدهد:
process.exit(1)
کد خروج به صورت پیشفرض 0 است که موفقیتآمیز بودن عملیات را نشان میدهد. کدهای خروجی مختلفی وجود دارند که میتوانید در سیستم خود استفاده کنید تا برنامه با سایر برنامهها در تعامل باشد.
میتوانید ویژگی process.exitCode را به صورت زیر مشخص کنید:
process.exitCode = 1
در این حالت، زمانی که برنامه متوقف میشود، Node.js کد خروج را بازمیگرداند. تفاوت این روش با روش قبل این است که یک برنامه حتی زمانی که همه پردازشها خاتمه یافته باشند، با احتیاط بسته میشود.
مثال بخش اول را به خاطر دارید؟ در آن مثال یک سرور ایجاد کردید. شما در اغلب موارد در Node.js سرورهایی مانند سرور HTTP زیر را راه اندازی میکنید:
const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.send('Hi!')
})
app.listen(3000, () => console.log('Server ready'))
در حالت عادی، این برنامه هرگز به پایان نمیرسد. از طرفی اگر ()process.exit را هم فراخوانی کنید، همه چیز به صورت ناگهانی متوقف میشود و کار درستی نیست. در این حالت، باید یک دستور مبنی بر سیگنال SIGTERM ارسال کنید و آن را با استفاده از هندلر سیگنال پردازش، مدیریت کنید. توجه داشته باشید که process به require نیاز ندارد و به صورت خودکار ارائه میشود:
const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.send('Hi!')
})
const server = app.listen(3000, () => console.log('Server ready'))
process.on('SIGTERM', () => {
server.close(() => {
console.log('Process terminated')
})
})
سیگنال یک اعلان است که به یک پردازش ارسال میشود تا به آن اطلاع دهد که رویدادی رخ داده است. دو سیگنال مهمی که باید با آنها آشنا باشید عبارتند از:
سیگنال SIGKILL: سیگنالی است که به پردازش اعلام میکند تا بدون درنگ متوقف شود و عملکردی مشابه با ()process.exit دارد.
سیگنال SITERM: سیگنالی است که به پردازش اعلام میکند تا پردازش را با احتیاط بیشتری متوقف کند. این سیگنال از سوی مدیریتهای پردازش مانند upstart یا supervisord و موارد مشابه ارسال میشود. همچنین میتوان آن را از درون برنامه در تابع دیگری نیز ارسال کرد:
process.kill(process.pid, 'SIGTERM')
همچنین امکان ارسال این سیگنال از یک برنامهی اجرایی دیگر Node.js یا از اپلیکیشن اجرایی دیگری در سیستم وجود دارد. در این مورد، آن اپلیکیشن باید PID پردازشی که قرار است خاتمه یابد را بداند.
process.env.NODE_ENV // "development"
مشخص کردن این متغیرها به صورت production پیش از اجرای کد به Node.js اعلام میکند که محیط مورد نظر، یک محیط «توزیع نهایی» (production) است. به همین ترتیب میتوانید به هر متغیر سفارشی محیطی که تعیین کردهاید هم دسترسی داشته باشید.
تست کردن، یک عنصر کلیدی برای هر اپلیکیشن است. Jasmine یک فریم ورک تست برای Node.js است. در اوایل سال ۲۰۰۰، فریم ورکی به نام JsUnit برای تست برنامههای جاوا اسکریپت به وجود آمد. این فریم ورک بعدها ارتقا یافت و در حال حاضر با نام Jasmine شناخته میشود.
برای تست یک برنامهی Node.js، ابتدا با نوشتن دستور زیر در npm؛ فریم ورک Jasmine را نصب کنید:
npm install jasmine-node
کدی که قرار است تست شود باید در یک فایل جداگانه نوشته شده و عبارت 'spec' به نام فایل اضافه شود. تنها در صورتی که این پسوند اضافه شود، Jasmine قادر به تشخیص است که یک فایل باید اجرا شود. فرض کنید برنامهی سادهی جمع دو عدد را به شکل زیر دارید:
var exports=module.exports={};
exports.AddNumber=function(a,b)
{
return a+b;
};
برای تست این برنامه باید یک فایل با نام add-spec.js بسازید و کد زیر را در آن اضافه کنید:
var app=require("../Add.js");
describe("Addition",function(){
it("The function should add 2 numbers",function() {
var value=app.AddNumber(5,6);
expect(value).toBe(11);
});
});
این کد در اصل برنامهی تست را به عنوان ورودی گرفته و دو عدد را برای آزمون و خطا به آن میفرستد. حال برای اجرای تست باید فرمان jasmine را در محیط فرمان وارد کنید:
C:\Users\Your Name>jasmine
اگر همه چیز موفقیت آمیز باشد، عبارت 1 sepc در خط فرمان نمایش داده میشود. در غیر این صورت خطاها تحت عنوان failures قابل بررسی خواهند بود.
جاوا اسکریپت یکی از قدرتمندترین زبانهای برنامه نویسی جهان است و کاربردهای متنوعی دارد. یکی از محیطهایی که به برنامه نویسان اجازه میدهد کدهای جاوا اسکریپت خود را سمت سرور اجرا کنند، Node.js است. با Node.js میتوان به کمک جاوا اسکریپت ظاهر و منطق سرویس تحت وب خود را در کنار هم ایجاد کرد و دیگر برای برنامه نویسی سمت سرور به زبان هایی مثل PHP یا Ruby نیازی نیست. در این مقاله به آموزش Node.js پرداختیم: آموختیم که Node.js چیست و چه کاربردهایی دارد. برای آشنایی بیشتر با سوالات مربوط به Node.js در مصاحبههای شغلی، حتما مقالهی 25 پرسش و پاسخ در Node.js را مطالعه کنید. اگر تجربهی کار با Node.js را دارید و یا در مورد آموزش Node.js سوال دارید، حتما آن را با ما و سایر کاربران سون لرن به اشتراک بگذارید.
اگر به یادگیری بیشتر در زمینه جاوا اسکریپت علاقه داری، با شرکت در دوره جاوا اسکریپت در کمتر از یک سال به یک متخصص JS همه فن حریف تبدیل میشوی که آمادهی استخدام، دریافت پروژه و یا فول-استک شدن هستی.
دوره الفبای برنامه نویسی با هدف انتخاب زبان برنامه نویسی مناسب برای شما و پاسخگویی به سوالات متداول در شروع یادگیری موقتا رایگان شد: