Stack Overflow-un 2022-ci ildə keçirdiyi sorğunun nəticələrinə əsasən, developerlərin təxminən 50%-i Node.js istifadə etdiyini bildirmişdir ki, bu da onu server-side texnologiyaları arasında ən çox istifadə edilən edir. Eyni zamanda, Express ümumilikdə dördüncü ən populyar veb texnologiya olaraq siyahıya alınmış və ən populyar server-side veb framework olaraq seçilmişdir. Node.js, server-side JavaScript tətbiqlərini işlədə bilən bir runtime mühitidir, Express isə Node.js üzərində işləyən və tətbiqlərin inkişafı üçün istifadə edilən server-side JavaScript veb frameworkudur.
Back-end development, server-side development olaraq da tanınır və istifadəçilərin görmədiyi veb saytın və ya tətbiqin hissəsini yaratmaqdan ibarətdir. Serveri, bazanı və tətbiq məntiqini idarə edir və frontend-in lazım olan məlumatlara və funksionallığa çıxışını təmin edir.
- Server: Müştərilərə şəbəkə üzərindən resurslar, məlumatlar, xidmətlər və ya proqramlar təmin edən hardware və ya software.
- Database: Asanlıqla əldə edilə bilən, idarə edilə bilən və yenilənə bilən strukturlu məlumatlar toplusu.
- SQL Databases: Relational bazalar, məsələn MySQL, PostgreSQL və SQLite.
- NoSQL Databases: Non-relational bazalar, məsələn MongoDB, Cassandra və Redis.
- Server-Side Proqramlaşdırma dilləri:
- Node.js: Chrome-un V8 JavaScript mühərriki üzərində qurulmuş JavaScript runtime.
- Python: Oxunaqlılığı və səmərəliliyi ilə tanınan yüksək səviyyəli proqramlaşdırma dili.
- Ruby: Sadəliyə fokuslanmış dinamik, açıq mənbəli proqramlaşdırma dili.
- Java: Geniş miqyaslı tətbiqlər üçün istifadə edilən çox yönlü və güclü proqramlaşdırma dili.
- Framework və Kitabxanalar:
- Express: Minimalist və çevik Node.js veb tətbiq framework-ü.
- Django: Sürətli inkişafı təşviq edən yüksək səviyyəli Python veb framework-ü.
- Ruby on Rails: Ruby ilə yazılmış server-tərəfli veb tətbiq framework-ü.
- Spring: Java inkişafı üçün hərtərəfli framework.
-
Məlumatların İşlənməsi və Təhlükəsizliyi:
- Məlumat Bazası Dizaynı: Məlumatların səmərəli və təhlükəsiz saxlanmasını təmin etmək üçün məlumat bazası strukturunun dizaynı.
- Məlumatların Şifrələnməsi: Məlumatların təhlükəsizliyini təmin etmək üçün şifrələmə texnologiyalarının tətbiqi.
- Təhlükəsizlik Protokolları: SQL injection və digər kibertəhlükələrdən qorunmaq üçün təhlükəsizlik tədbirlərinin görülməsi.
-
Server və Baza İdarəetməsi:
- Serverlərin Quraşdırılması və İdarə Edilməsi: Serverlərin quraşdırılması və müştəri sorğularını idarə etmək üçün optimallaşdırılması.
- Yedəkləmə və Bərpa: Məlumatların itirilməsinin qarşısını almaq üçün yedəkləmə proseslərinin qurulması və bərpa strategiyalarının tətbiqi.
-
API İnkişafı və İnteqrasiyası:
- API Dizaynı: Tətbiqlərin və xidmətlərin bir-biri ilə əlaqə saxlaması üçün API-lərin dizaynı və inkişafı.
- RESTful və GraphQL API-lər: HTTP sorğuları ilə işləyən RESTful və daha effektiv məlumat sorğusu üçün GraphQL API-lərin qurulması.
-
Proqramlaşdırma və Script Yazma:
- Server-Tərəfli Kod Yazma: JavaScript (Node.js), Python, Ruby, PHP və Java kimi dillərdə server tərəfində məntiqi işlətmək üçün kod yazma.
- Skript Yazma: Serverin funksionallığını təmin etmək üçün skriptlərin yazılması və idarə edilməsi.
-
Miqyaslana Bilən Sistemlərin İnkişafı:
- Yük Paylanması: Server yükünü tarazlaşdırmaq üçün texnologiyaların tətbiqi.
- Miqyaslana Bilən Baza Dizaynı: Artan məlumat həcmini idarə edə biləcək baza strukturlarının yaradılması.
-
Performance Optimizasiyası:
- Keşləşdirmə: Daha sürətli məlumat əldə etmək üçün məlumatların keşləşdirilməsi.
- Sorğu Optimizasiyası: Daha səmərəli məlumat sorğusu üçün SQL sorğularının optimizasiya edilməsi.
-
Bacarıqlı Əlaqə və Komanda İşbirliyi:
- Komanda Əlaqəsi: Frontend developerlar və digər komanda üzvləri ilə effektiv əməkdaşlıq.
- Sənədləşdirmə: Yazılmış kodların və proseslərin sənədləşdirilməsi.
Front-end development, client-side development olaraq da tanınır və istifadəçilərin birbaşa qarşılıqlı əlaqə qurduğu veb saytın və ya tətbiqin hissəsini yaratmaqdan ibarətdir. Bu, istifadəçinin vizual olaraq təcrübə etdiyi və qarşılıqlı əlaqə qurduğu hər şeyi əhatə edir.
- HTML (HyperText Markup Language): Veb səhifələrin strukturu, başlıqlar, paraqraflar, şəkillər və bağlantılar kimi elementlərin tərtib edilməsi.
- CSS (Cascading Style Sheets): Veb səhifələrin dizaynı, düzülüş, rənglər, şriftlər və responsive-lik daxil olmaqla stilin müəyyənləşdirilməsi.
- JavaScript: Veb səhifələrdə formalar, animasiyalar və dinamik məzmun yeniləmələri kimi interaktiv xüsusiyyətlərin təmin edilməsi.
- Framework və Kitabxanalar:
- React: İstifadəçi interfeysləri qurmaq üçün JavaScript kitabxanası.
- Angular: Veb tətbiqləri qurmaq üçün TypeScript əsaslı framework.
- Vue.js: İstifadəçi interfeysləri qurmaq üçün inkişaf edən JavaScript framework-ü.
-
İstifadəçi Təcrübəsinin Təmin Edilməsi:
- Təcrübənin Dizaynı: İstifadəçi interfeysi və dizayn prinsipləri əsasında istifadəçi dostu və estetik cəhətdən xoş bir təcrübə yaratmaq.
- Responsive Dizayn: Tətbiqin müxtəlif ekran ölçülərinə uyğun olaraq optimallaşdırılması.
-
İnteraktiv Elementlərin İnkişafı:
- JavaScript Kodlaşdırması: Formlar, animasiyalar və digər dinamik xüsusiyyətlər üçün JavaScript kodlarının yazılması.
- Asinxron Məlumat Yüklənməsi: AJAX və Fetch API-ləri istifadə edərək məlumatların serverdən alınması və yenilənməsi.
-
Təhlükəsiz və Performanslı Veb Tətbiqlərin Yaradılması:
- Kodun Performansını Təmin Etmək: Yük vaxtını azaltmaq və istifadəçi təcrübəsini artırmaq üçün optimizasiya işlərinin aparılması.
- Təhlükəsizlik Tədbirləri: XSS (Cross-Site Scripting) və digər təhlükəsizlik zəifliklərinə qarşı mühafizə tədbirlərinin görülməsi.
-
Dizayn və İnkişaf Üçün Alətlərin İstifadəsi:
- Version Control: Git kimi alətlərdən istifadə edərək kod versiyalarının idarə edilməsi.
- Frontend Frameworklərin İstifadəsi: React, Angular və Vue.js kimi frameworklərdən istifadə edərək sürətli və effektiv inkişaf.
-
Komanda ilə Əməkdaşlıq:
- Layihə Planlaşdırılması: Backend developerlar və dizaynerlərlə birlikdə layihənin məqsəd və tələblərinə uyğun inkişafın təmin edilməsi.
- Geri Dönüşlərin Əldə Edilməsi: İstifadəçilərin və komanda üzvlərinin fikirlərini toplayaraq tətbiqin təkmilləşdirilməsi.
Full-stack tətbiqi aşağıdakı komponentləri əhatə edir:
İstifadəçilərin qarşılıqlı əlaqə qurduğu veb sayt və mobil tətbiqlər.
Müştəri tərəfindən edilən sorğuları işləyir və cavabları müştəriyə göndərir. Bulud server, tətbiq serveri və məlumat bazasını yerləşdirir.
JavaScript, HTML səhifələrinin müştəri tərəfində doğrulanması üçün idealdır, çünki çox yönlü və platformalar-arası uyğunluğa malikdir. İstifadəsinin asanlığını nəzərə alaraq, JavaScript server tərəfi kodlaşdırma üçün də uyğunlaşdırıldı və nəticədə Node.js meydana gəldi. Node.js bir işləmə mühiti kimi fəaliyyət göstərir və xüsusi lisenziyaya ehtiyac duymur. Bununla yanaşı, açıq mənbə təbiəti sayəsində Node.js üçün çox sayda paket və kitabxana inkişaf etdirilmişdir. Üstəlik, Node.js kodu Linux, Windows və Mac OSX kimi müxtəlif əməliyyat sistemlərində problemsiz şəkildə işləyə bilər.
Yazdığınız hər bir kod parçası işlənməli və maşın tərəfindən oxunan formaya çevrilməlidir. Node.js dünyasında, JavaScript kodu Google V8 mühərriki ilə icra edilir. V8, yüksək performansı ilə tanınan və Google tərəfindən inkişaf etdirilən açıq mənbə mühərrikidir, eyni zamanda bütün Google Chrome brauzerlərində inteqrasiya edilmişdir. Bundan əlavə, müasir brauzerlər, məsələn, Microsoft Edge və Firefox, Node.js kodunu icra etmək üçün V8 mühərrikini istifadə edir.
Server prosesləri "single-threaded" və ya "multi-threaded" olaraq təsnif edilə bilər. Single-threaded mühitdə yalnız bir əmrlə işlənir, multi-threaded mühitdə isə eyni anda birdən çox əmrlə işlənir. Single-threaded olmasına baxmayaraq, Node.js asinxron və bloklanmayan təbiəti ilə performansda mükəmməldir. Bu o deməkdir ki, bir proses icra edilərkən proqramın tamamlanmasını gözləməyə ehtiyac yoxdur. Node.js hadisə-əsaslıdır (event-driven), yəni şəbəkədən oxumaq və ya məlumat bazasına və ya fayl sisteminə daxil olmaq kimi giriş/çıxış (I/O) əməliyyatı yerinə yetirildikdə bir hadisə işlənilir. Bu bloklanmayan davranış serverin cavabdeh qalmasını və eyni anda bir neçə işi yerinə yetirməsini təmin edir, multi-threaded mühitə bənzəyir.
JSON (JavaScript Object Notation) "açar-dəyər cütləri" ("key-value pairs") şəklində formatlanmışdır. Payload (yük) müştəri ilə server arasında ötürülən məlumatları təmsil edir. Müştəri serverə məlumat göndərmək istədikdə, bunu JSON obyektində edir.
{
"name": "John",
"age": "24",
"email": "johnparker@gmail.com"
}
Yuxarıdakı obyekt JSON-dur. Bu məlumat sorğu daxilində göndərildikdə, dəyərləri sadəcə request.name
və s. istifadə edərək çıxarıla bilər.
Eyni şəkildə, cavab da JSON şəklində göndərilir.
{
"status": "ok",
"message": "Successfully added"
}
Node.js server yaratmaq üçün paketlər təqdim etsə də, Express framework-ü API-lər və endpointlər yaratma prosesini sadələşdirir. API endpointi müştəridən serverə edilən sorğu üçün xüsusi bir giriş nöqtəsidir.
-
Birləşdirilmiş Dili: Node.js-in istifadə edilməsi, inkişaf etdiricilərə həm müştəri tərəfində, həm də server tərəfində JavaScript-dən istifadə etməyə imkan tanıyır. Bu, fərqli dillər arasında keçid etmə ehtiyacını azaldır və inkişaf prosesini daha uyğun və səlis edir.
-
Davamlı Alətlər: Node.js istifadə edərkən test etmə və asılılıq idarəetmə alətlərini həm müştəri tərəfi, həm də server tərəfi kodu üzərində tətbiq edə bilərsiniz. Bu, NPM-dən paket idarəetməsi üçün istifadə etməyi də əhatə edir.
-
İcma və Resurslar: Node.js geniş və aktiv bir icmaya malikdir, bu da əhatəli öyrənmə resursları və dəstək deməkdir. Peşəkar inkişaf etdiricilərin 50%-dən çoxu Node.js-dən istifadə edir, bu da onun populyarlığını və faydalılığını əks etdirir.
-
JavaScript İnkişaf etdiriciləri üçün Asan Keçid: Əgər JavaScript ilə tanışsınızsa, Node.js-ə keçid backend inkişafı üçün yeni bir dili öyrənməkdən daha hamar olacaq.
-
Asinxron Proqramlaşdırma: Node.js single-threaded, bloklanmayan I/O modeli və hadisə-əsaslı arxitekturadan istifadə edir, bu da çox sayda eyni anda əlaqəni effektiv şəkildə idarə edə bilir.
-
Performans: Google V8 mühərriki üzərində qurulan Node.js, sürətli işləmə və yüksək yükləmə tələb edən senarilərdə mükəmməl nəticələr verir, məsələn, onlayn oyunlar, çat tətbiqləri və real-vaxt məlumat emalı.
-
Mikroservislərlə Uyğunluq: Node.js mikroservis memarlığı ilə yaxşı uyğun gəlir, burada xidmətlər kiçik, fokuslanmış və miqyaslana biləndir.
-
Paketsiz İmkanlar: NPM qeydiyyatı geniş seçimi olan paketlər təqdim edir, inkişaf imkanlarını artırır və tətbiqlərin yaradılma prosesini sürətləndirir.
Node.js-də modullar, tətbiqin müxtəlif hissələrində təkrar istifadə edilə bilən funksionallığın özündə saxlayan, müstəqil bölmələrdir. Bu modullar fərdi fayllar və ya çoxsaylı fayl və qovluqlardan ibarət kolleksiyalar ola bilər. Modulyar yanaşma mürəkkəb kodun idarə edilə bilən hissələrə bölünməsinə və kodun təkrar istifadəsinin təşviq edilməsinə kömək edir.
Modulun daxilindəki kodu xarici tətbiqdə istifadə etmək üçün inkişaf etdiricilər require()
və ya import()
ifadələrindən istifadə edirlər. Bu iki üsul arasındakı seçim istifadə olunan modul spesifikasiyasından asılıdır. Node.js əsasən iki modul spesifikasiyasını dəstəkləyir: CommonJS və ES modulları.
-
CommonJS:
- Node.js-də Default: Node.js, JavaScript kodunu standart olaraq CommonJS modulları kimi qəbul edir.
- Sintaksis: Modulları import etmək üçün
require()
istifadə edir. - Export: Funksionallığı export etmək üçün
module.exports
istifadə edir.
-
ES Modulları:
- Node.js-də Aktivləşdirmək: ES modullarını
.mjs
fayl uzantısından istifadə etməklə aktivləşdirmək mümkündür. - Sintaksis: Modulları gətirmək üçün
import
və funksionallığı əlçatan etmək üçünexport
istifadə edir.
- Node.js-də Aktivləşdirmək: ES modullarını
-
Kodda Yerləşmə (Placement in Code):
- require: Faylın hər hansı bir yerində, o cümlədən funksiyalar və şərtli ifadələr daxilində çağırıla bilər.
- import: Faylın əvvəlində çağırılmalı və şərtli olaraq yüklənə bilməz.
-
Bağlama (Binding):
- require: Dinamik olaraq bağlanır, yəni modul həlli icra vaxtında baş verir. Funksiyaların təriflərinə əlaqələndirilməsindəki səhvlər yalnız kod icra olunduqda aşkar edilə bilər.
- import: Statik olaraq bağlanır, səhvlərin tərtib vaxtında aşkar olunmasına imkan verir, bu da daha yaxşı səhv yoxlamasını təmin edir.
-
Sinxron və Asinxron (Synchronous vs. Asynchronous):
- require: Sinxron, modulları xətti, bloklaşdırıcı şəkildə yükləyir və işləyir.
- import: Asinxron, modulların paralel olaraq yüklənməsinə imkan verir, bu da iri miqyaslı tətbiqlərdə performansı artırır.
CommonJS Nümunəsi:
CommonJS ilə Export:
// message.js
module.exports = "Hello programmers";
CommonJS ilə Import:
// main.js
let msg = require('./message.js');
console.log(msg); // Nəticə: Hello programmers
ES Modulları Nümunəsi:
ES Modulları ilə Export:
// module.mjs
const a = 1;
export { a as myValue };
ES Modulları ilə Import:
// main.mjs
import { myValue } from './module.mjs';
console.log(myValue); // Nəticə: 1
- Modullar: Node.js-də özündə kodu saxlayan və təkrar istifadəni və idarə olunmasını təşviq edən müstəqil bölmələrdir.
- Spesifikasiyalar: CommonJS və ES modulları, fərqli import/export sintaksisi ilə.
- require vs. import:
require
: Dinamik, sinxron, hər yerdə istifadə edilə bilər.import
: Statik, asinxron, faylın əvvəlində istifadə edilməlidir.
Bu iki import metodunun fərqlərini və müvafiq istifadə hallarını başa düşmək, Node.js tətbiqlərində daha səmərəli və səhvsiz kod yazmağa kömək edir.
JavaScript, veb inkişafında ən təsirli proqramlaşdırma dillərindən biri olmuşdur. Əvvəlcə statik veb səhifələrə dinamik davranış əlavə etmək üçün yaradılan JavaScript, indi həm müştəri, həm də server tərəflərində işləyən çox yönlü bir dildir.
- Müştəri Tərəfli Başlanğıclar: JavaScript ilk olaraq veb brauzerlər daxilində icra olunmaq üçün yaradıldı və statik HTML səhifələrini dinamik, interaktiv xüsusiyyətlərlə zənginləşdirdi.
- İnterpretasiya Edilən Dil: Kompilyasiya olunan dillərdən fərqli olaraq, JavaScript interpretasiya edilir, yəni icra edilmədən əvvəl kompilyasiya mərhələsinə ehtiyac yoxdur.
- Java ilə Əlaqəsi Yoxdur: Adına və oxşar sintaksisinə baxmayaraq, JavaScript Java proqramlaşdırma dilindən törəmə deyil.
- Geniş Dəstək: Bütün müasir veb brauzerlər JavaScript-i dəstəkləyir, onu veb inkişafı üçün hər yerdə mövcud bir vasitə halına gətirir.
- İstifadəçi İnterfeysi (UI): HTML və CSS istifadə edilərək yaradılır.
- Müştəri Tərəfli Məntiq: İstifadəçi UI ilə qarşılıqlı əlaqə yaratdıqda, JavaScript müştəri tərəfli iş məntiqini idarə edir.
- Veb Xidmət Sorğusu: JavaScript serverə sorğular göndərir, adətən JSON üzərindən HTTP istifadə olunur.
- Server Tərəfli Emal: Ənənəvi olaraq, server tərəfli emal Java və ya PHP kimi dillərdən istifadə etməklə həyata keçirilirdi.
- Cavab: Server sorğunu emal edir və müştəriyə məlumat qaytarır.
Node.js, JavaScript-in imkanlarını server tərəfinə qədər genişləndirir və inkişaf etdiricilərə həm müştəri, həm də server tərəfli kodu JavaScript-də yazmağa imkan verir. Node.js ilə proses belə görünür:
- İstifadəçi İnterfeysi (UI): HTML və CSS istifadə edilərək yaradılır.
- Müştəri Tərəfli Məntiq: JavaScript müştəri tərəfli iş məntiqini idarə edir.
- Veb Xidmət Sorğusu: Müştəri tərəfli JavaScript tətbiqi, JSON formatında məlumat göndərərək HTTP sorğusu edir.
- REST Veb Xidməti: Sorğunu serverdə qarşılayan RESTful xidmət.
- Node.js Serveri: Başqa bir backend dilində yazılmış tətbiqi çağırmaq əvəzinə, Node.js serveri sorğunu JavaScript istifadə edərək emal edir.
- Birləşmiş Dil: İnkişaf etdiricilər həm müştəri, həm də server tərəflərində JavaScript istifadə edə bilər, bu da inkişaf prosesini sadələşdirir.
- Miqyasa Uyğunluq: Node.js çoxsaylı eyni vaxtlı əlaqələri səmərəli şəkildə idarə etmək üçün nəzərdə tutulmuşdur, bu da onu miqyasa uyğun tətbiqlər üçün uyğun edir.
- Minimal Alətlər Dəsti: Node.js server tətbiqlərini yaratmaq üçün minimal alətlər dəsti ilə sürətli inkişafı təmin edir.
- JavaScript: Əvvəlcə müştəri tərəfli dil kimi, indi Node.js ilə server tərəfli inkişafda istifadə olunur.
- Node.js: Server tərəfli JavaScript-i təmin edən, miqyasa uyğun, səmərəli və sürətli server tətbiqlərinin inkişafını mümkün edən bir framework.
- Birləşmiş İnkişaf: Həm müştəri, həm də server tərəfli kodu JavaScript-də yazmaq, inkişaf axınını sadələşdirir və yeni inkişaf etdiricilər üçün öyrənmə əyrisini azaldır.
Node.js, JavaScript-dən istifadə edərək miqyaslana bilən, eyni zamanda işləyə bilən server tətbiqləri qurmaq üçün güclü bir server-tərəf runtime mühitdir. Bu, hadisə idarə olunan, bloklamayan I/O modelinə əsaslanır, bu da onu məlumat-intensive real vaxt tətbiqləri üçün yüngül və səmərəli edir.
- Single-Threaded Event Loop: Node.js, hadisələr və callback funksiyaları vasitəsilə I/O əməliyyatlarını asinxron şəkildə idarə edən single-threaded hadisə döngüsündə işləyir.
- Modules: Node.js-də hər bir JavaScript faylı bir moduldur. Node.js, müxtəlif funksiyaları asanlaşdırmaq üçün HTTP modulu kimi daxili istifadə modulları ilə təmin olunur.
-
Quraşdırma: Node.js-in quraşdırıldığına əmin olun. Siz onu Node.js rəsmi veb saytından yükləyə bilərsiniz.
-
Yeni JavaScript Faylı Yaradın:
server.js
(və ya istədiyiniz ad) adında yeni bir fayl yaradın. -
HTTP Modulunu İdxal Edin: HTTP modulu təmin edilmiş Node.js ilə idxal edin.
const http = require('http');
-
Serveri Yaradın: Yeni server instansiyası yaratmaq üçün
http.createServer
metodundan istifadə edin. Bu metod daxil olan sorğuları idarə edən və cavabları göndərən callback funksiyasını qəbul edir.const server = http.createServer((req, res) => { // Cavab HTTP başlığını HTTP statusu və Content type ilə təyin edin res.writeHead(200, {'Content-Type': 'text/plain'}); // Cavab gövdəsini "Hello, World!" olaraq göndərin res.end('Hello, World!\n'); });
-
Serverin Bir Portda Dinləməsini Təmin Edin: Server instansiyasında
listen
metodunu çağıraraq onu müəyyən bir portda (məsələn, 8080) dinləmək üçün qurun.server.listen(8080, () => { console.log('Server http://127.0.0.1:8080/ ünvanında işləyir.'); });
-
Serveri İcra Edin: Faylı yadda saxlayın və terminaldan Node.js istifadə edərək serveri işlədin.
node server.js
Terminalda
Server http://127.0.0.1:8080/ ünvanında işləyir.
mesajını görməlisiniz. -
Serverə Giriş: Veb brauzerinizi açın və
http://127.0.0.1:8080/
ünvanına keçin. "Hello, World!" mesajını görməlisiniz.
Burada, Node.js ilə əsas veb server yaratmaq üçün tam kod verilmişdir:
// HTTP modulunu idxal edin
const http = require('http');
// Serverin bir instansiyasını yaradın
const server = http.createServer((req, res) => {
// Cavab HTTP başlığını HTTP statusu və Content type ilə təyin edin
res.writeHead(200, {'Content-Type': 'text/plain'});
// Cavab gövdəsini "Hello, World!" olaraq göndərin
res.end('Hello, World!\n');
});
// Serverin 8080 portunda dinləməsini təmin edin
server.listen(8080, () => {
console.log('Server http://127.0.0.1:8080/ ünvanında işləyir.');
});
- Node.js: Asinxron şəkildə I/O əməliyyatlarını idarə edən single-threaded, hadisə idarə olunan mühitdir.
- Modullar: Hər JavaScript faylı bir moduldur və Node.js HTTP kimi bir neçə daxili modulu əhatə edir.
- HTTP Modulu: HTTP sorğularını dinləyən və onlara cavab verən veb serverləri yaratmaq üçün istifadə olunur.
- Server Yaratma:
http.createServer()
ilə server instansiyası yaratmaq vəserver.listen()
ilə müəyyən bir portda dinləməsini təmin etmək.
Node.js-də modullar tətbiq inkişafının əsas hissəsidir, kodu təşkil etməyə və təkrar istifadəyə imkan verir. Bir paket, bir və ya daha çox modulların kolleksiyasıdır və package.json
faylı paket haqqında əsas məlumatları təmin edir. Budur, Node.js modulları ilə necə işləmək haqqında ətraflı məlumat:
package.json
faylı, layihəniz haqqında metadata, asılılıqlar, skriptlər və s. daxil olan manifest kimi xidmət edir. Budur, bir package.json
faylının əsas strukturu:
{
"name": "today",
"version": "1.0.0",
"description": "A simple module to get today's date",
"main": "lib/today.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Your Name",
"license": "ISC"
}
- name: Paketinizin adı.
- version: Paketinizin versiyası.
- main: Paketinizin giriş nöqtəsi (məsələn,
lib/today.js
). - scripts: Müxtəlif komanda skriptlərini çalışdırmaq üçün (məsələn, testlər).
- author: Paketinizin müəllifi.
- license: Paketinizin paylanma lisenziyası.
Node.js tətbiqinizdə bir modulu istifadə etmək üçün require
funksiyasından istifadə edərək idxal edirsiniz. Budur necə işləyir:
-
Sadə Modul İdxalı: Tutaq ki,
today.js
faylı əsas tətbiq faylınız olanapp.js
ilə eyni qovluqdadır.// today.js module.exports = { getDate: function() { return new Date().toDateString(); } };
// app.js const today = require('./today'); console.log(today.getDate());
-
Bir Qovluqda Varsayılan Modul: Əgər modulunuz bir qovluğun içindədirsə və əsas skript
index.js
adlanırsa, onu qovluq adını göstərərək idxal edə bilərsiniz.// mod_today/index.js module.exports = { getDayOfWeek: function() { const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; return days[new Date().getDay()]; } };
// app.js const modToday = require('./mod_today'); console.log(modToday.getDayOfWeek());
Başqa fayllara funksiyalar və ya dəyərləri əlçatan etmək üçün exports
obyektindən istifadə edirsiniz. Budur bir nümunə:
// today.js
exports.dayOfWeek = function() {
const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
return days[new Date().getDay()];
};
Bu modulu idxal etdiyiniz zaman, dayOfWeek
funksiyasına giriş əldə edə bilərsiniz:
// app.js
const today = require('./today');
console.log(today.dayOfWeek());
Budur bir Node.js layihəsinin nümunə qovluq strukturu:
my-project/
├── mod_today/
│ └── index.js
├── today.js
├── app.js
└── package.json
- mod_today/index.js: Modul məntiqini ehtiva edir.
- today.js: Başqa bir modul faylı.
- app.js: Əsas tətbiq faylı.
- package.json: Layihə və asılılıqları haqqında məlumat verir.
- package.json: Node.js layihəniz haqqında metadata ehtiva edir.
- Modullar: Layihənizdə təkrar istifadə edilə bilən JavaScript kod parçalarıdır.
- require: Node.js-də modulları idxal etmək üçün istifadə olunur.
- exports: Bir moduldan funksiyalar və ya dəyərləri əlçatan etmək üçün istifadə olunur.
Kodunuzu modullara bölərək və layihənizi idarə etmək üçün package.json
faylından istifadə edərək, miqyaslana bilən və saxlanıla bilən Node.js tətbiqləri yarada bilərsiniz.
Node.js-də modullar, tətbiqləri effektiv şəkildə qurmaq və saxlamaq üçün təkrar istifadə edilə bilən kod parçalarıdır. Modullar üç növə bölünə bilər: əsas, yerli və üçüncü tərəf.
-
Əsas Modullar:
- Tərif: Node.js runtime-a daxil olan və əlavə kitabxanalara ehtiyac duymadan əsas funksionallıqları təmin edən modullar.
- Nümunələr:
http
,fs
,os
,path
,util
,url
,querystring
.
-
Yerli Modullar:
- Tərif: Sizin və ya inkişaf komandası tərəfindən tətbiqinizin bir hissəsi olaraq yaradılan xüsusi modullar.
- Nümunə: Tarixlə bağlı funksionallıqları təmin edən
today.js
adlı bir modul.
-
Üçüncü Tərəf Modulları:
- Tərif: Node.js icması tərəfindən yaradılan və onlayn mövcud olan modullar (məsələn, npm vasitəsilə).
- Nümunələr:
express
,axios
,async
.
Əsas modullar Node.js tətbiqləri üçün vacib funksionallıqları təmin edir. Burada bəzi mühüm nümunələr və kod nümunələri var:
-
HTTP Modulu:
-
Məqsəd: HTTP üzərindən məlumatları ötürmək.
-
İstifadə:
const http = require('http'); http.createServer((req, res) => { res.write('Serverdən salam'); res.end(); }).listen(6000);
-
-
FS (Fayl Sistemi) Modulu:
-
Məqsəd: Fayl sistemi ilə qarşılıqlı əlaqə qurmaq.
-
İstifadə (Asinxron oxuma):
const fs = require('fs'); fs.readFile('sample.txt', 'utf8', (err, data) => { if (err) { console.error(err); return; } console.log(data); });
-
İstifadə (Sinxron oxuma):
const fs = require('fs'); const data = fs.readFileSync('content.md', 'utf8'); console.log(data);
-
-
OS Modulu:
-
Məqsəd: Əməliyyat sistemi ilə qarşılıqlı əlaqə qurmaq.
-
İstifadə:
const os = require('os'); console.log("Platforma: " + os.platform()); console.log("Arxitektura: " + os.arch());
-
-
Path Modulu:
-
Məqsəd: Kataloq və fayl yolları ilə işləmək.
-
İstifadə:
const path = require('path'); const result = path.basename('/content/index/home.html'); console.log(result); // Çıxış: home.html
-
-
Util Modulu:
-
Məqsəd: Düzgünlüyü yoxlamaq və yardımçı funksiyalar üçün.
-
İstifadə:
const util = require('util'); const str = 'Döngə %d dəfə icra olundu.'; for (let i = 1; i <= 10; i++) { console.log(util.format(str, i)); }
-
-
URL Modulu:
-
Məqsəd: URL-ləri pars etmək.
-
İstifadə:
const url = require('url'); const webAddress = 'http://localhost:2000/index.html?lastName=Kent&firstName=Clark'; const qry = url.parse(webAddress, true); const qrydata = qry.query; console.log(qrydata.firstName); // Çıxış: Clark
-
-
QueryString Modulu:
-
Məqsəd: URL-in sorğu sətirlərini pars etmək.
-
İstifadə:
const querystring = require('querystring'); const qryParams = querystring.parse('lastName=Kent&firstName=Clark'); console.log(qryParams.firstName); // Çıxış: Clark
-
Üçüncü tərəf modulları Node.js funksionallıqlarını genişləndirir. Bəzi məşhur nümunələr:
- Express: Minimal və çevik Node.js web tətbiq çərçivəsi.
- Axios: Browser və Node.js üçün vədəsiz HTTP müştərisi.
- AsyncJS: Asinxron JavaScript ilə işləmək üçün güclü funksiyalar təmin edən yardımçı modul.
Üçüncü tərəf modulları npm (Node Package Manager) vasitəsilə quraşdıra bilərsiniz:
npm install express
Paket meneceri, proqram layihələrinin etibar etdiyi kitabxanalar və paketlər kimi asılılıqları idarə etmək üçün vacib bir vasitədir. Node Package Manager (NPM), Node.js üçün default paket meneceridir və bu asılılıqları effektiv şəkildə idarə etməkdə mühüm rol oynayır.
-
Əmr Sırası İnterfeysi (CLI):
- NPM, paketləri dərc etmək, yükləmək, quraşdırmaq, yeniləmək və silmək üçün komandalar təqdim edir.
-
Onlayn Repozitoriya:
- NPM, JavaScript paketlərinin versiyalarını və asılılıqlarını izləyən ətraflı bir verilənlər bazasını saxlayır.
Asılılıqlar, layihənizin etibar etdiyi xarici kitabxanalar və ya paketlərdir. Bu asılılıqları əl ilə idarə etmək çətin və səhvlərə yol açan bir proses ola bilər ki, NPM bu prosesi avtomatlaşdıraraq üstünlük təşkil edir.
- Məqsəd: Layihə haqqında metadata, o cümlədən onun asılılıqlarını ehtiva edir.
- Vacib Sahələr:
name
: Layihənin adı.version
: Layihənin versiya nömrəsi.
Əsas package.json
faylı nümunəsi:
{
"name": "my-project",
"version": "1.0.0"
}
Paketlər, NPM vasitəsilə yerli və ya qlobal olaraq quraşdırıla bilər.
-
Yerli Quraşdırma:
- Əmr:
npm install <package_name>
- İzahı: Paketi, layihənizin qovluğunda olan
node_modules
qovluğunda quraşdırır və yalnız həmin layihəyə əlçatan edir.
- Əmr:
-
Qlobal Quraşdırma:
- Əmr:
npm install -g <package_name>
- İzahı: Paketi qlobal olaraq quraşdırır və bu paketi maşındakı hər hansı bir layihəyə əlçatan edir. Qlobal quraşdırmaları diqqətlə istifadə edin ki, fərqli layihələr arasında versiya uyğunsuzluqlarının qarşısı alınsın.
- Əmr:
-
Yerli Quraşdırma:
npm install express
-
Qlobal Quraşdırma:
npm install -g express
NPM, paketləri yeniləmək və silmək üçün də komandalar təqdim edir:
-
Paketin Yenilənməsi:
npm update <package_name>
-
Paketin Silinməsi:
npm uninstall <package_name>
-
Asinxron Şəbəkə Əməliyyatları (Asynchronous Network Operations): Node.js-də şəbəkə əməliyyatları asinxron işləyir ki, cavab gözləyərkən prosessinq vaxtının itirilməsinin qarşısını alsın.
-
Non-blocking Əməliyyatlar: Node.js-də bütün şəbəkə əməliyyatları dərhal geri qaytarılır, tətbiqin şəbəkə əməliyyatının tamamlanmasını gözləmədən prosessinqə davam etməsinə imkan verir.
-
Callback Funksiyaları: Node.js asinxron əməliyyatların nəticələrini idarə etmək üçün callback funksiyalarından istifadə edir. Bu funksiyalar şəbəkə əməliyyatı tamamlandıqda çağırılır.
-
HTTP Sorğusu:
- Tətbiq
HTTP.request()
funksiyasını çağırır və bu funksiya uzaq veb serverə sorğu göndərir. - Node.js cavabı gözləmədən sorğunun uğurla göndərildiyini göstərən nəticəni dərhal geri qaytarır.
- Tətbiq
-
Callback İdarəetməsi (Callback Handling):
- Uzaq server cavab verdikdə, Node.js
HTTP.request()
çağırışında təyin edilmiş callback funksiyanı çağırır. - Bu callback funksiya HTTP cavab mesajını emal edir.
- Uzaq server cavab verdikdə, Node.js
-
Sadə HTTP Sorğusu:
- Tətbiq
HTTP.request()
funksiyasını çağırır. - Node.js sorğunu göndərir və uğur mesajı geri qaytarır.
- HTTP cavabı alındıqda, Node.js təyin edilmiş callback funksiyanı çağıraraq cavabı idarə edir.
- Tətbiq
-
Mürəkkəb Ssenari:
- Tətbiq xüsusi bir Node.js modulunu çağırır, bu modul
HTTP.request()
funksiyasını çağırır. - Modul sorğunu göndərir və control-u tətbiqə qaytarır.
- Cavab alındıqda, Node.js moduldakı təyin edilmiş callback funksiyanı çağırır və bu funksiya
data
vəend
kimi hadisələri emal edir.
- Tətbiq xüsusi bir Node.js modulunu çağırır, bu modul
Budur, Node.js istifadə edərək HTTP sorğusu etmək üçün bir nümunə:
const http = require('http');
const options = {
hostname: 'api.weather.gov',
path: '/stations/KSFO/observations/latest',
method: 'GET',
};
const req = http.request(options, (res) => {
let buffer = '';
res.on('data', (chunk) => {
buffer += chunk;
});
res.on('end', () => {
console.log(buffer);
});
});
req.on('error', (e) => {
console.error(`Problem with request: ${e.message}`);
});
req.end();
- Data Hadisəsi: Hər dəfə bir data parçası alındıqda işləyir.
- End Hadisəsi: Cavab tam olduqda işləyir.
- Error Hadisəsi: Sorğuda bir səhv olduqda işləyir.
- Non-blocking Əməliyyatlar: Node.js I/O əməliyyatlarını asinxron şəkildə idarə edir ki, tətbiq bloklanmasın.
- Callbacklər: Asinxron əməliyyatlardan gələn cavabları idarə etmək üçün istifadə olunur.
- Hadisə yönümlü Arxitektura (Event-driven Architecture): Node.js şəbəkə əməliyyatları zamanı
data
,end
vəerror
kimi hadisələr yaradır və bu hadisələr hadisə dinləyiciləri (event listeners) vasitəsilə idarə oluna bilər.
-
Asinxron Framework: Node.js geniş şəkildə callback funksiyalarını istifadə edərək asinxron əməliyyatların nəticələrini idarə edir və beləliklə, bloklanmayan icra (execution) təmin edilir.
-
Callback Səhv İdarəetməsi (Error Handling in Callbacks): Callback funksiyasında birinci parametr adətən səhv obyektidir. Əgər səhv obyekti müəyyən olunubsa, bu bir səhv baş verdiyini göstərir; əks halda, əməliyyat uğurla başa çatmışdır.
-
Səhv Yoxlaması (Error Handling):
- Callback funksiyası əvvəlcə səhv parametrinin müəyyən olunub-olunmadığını yoxlayır.
- Əgər bir səhv varsa, onu idarə edir və lazımi təmizləmələri aparır.
- Əgər səhv yoxdursa, nəticəni işləyir.
-
Hava Durumu Modulunda Callback Funksiyası:
- Əsas tətbiq hava durumu modulunun
current
funksiyasını yer parametri ilə çağırır. - Hava durumu modulu HTTP sorğusu çağırır və cavabı idarə etmək üçün anonim geri çağırış funksiyası təyin edir.
- Əsas tətbiq hava durumu modulunun
-
HTTP Sorğusu üçün Callback Funksiyası:
- Callback funksiyası
data
(data parçaları alındıqda) vəend
(cavab tam olduqda) kimi hadisələri işləyir.
- Callback funksiyası
const http = require('http');
const weather = {
current: function(location, resultCallback) {
const options = {
hostname: 'api.weather.gov',
path: `/stations/${location}/observations/latest`,
method: 'GET',
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
const weatherData = JSON.parse(data);
const temp_f = weatherData.properties.temperature.value;
resultCallback(null, temp_f);
});
});
req.on('error', (e) => {
resultCallback(e, null);
});
req.end();
}
};
// Əsas tətbiq
weather.current('KSFO', (err, temp_f) => {
if (err) {
console.error(`Hava durumunu aldıqda error: ${err.message}`);
} else {
console.log(`Cari hava dərəcəsi ${temp_f} Fahrenheit dərəcədir.`);
}
});
-
Tətbiq Çağırışı (Application Call):
- Əsas tətbiq
weather.current()
funksiyasını bir yer və bir geri çağırış funksiyası ilə çağırır.
- Əsas tətbiq
-
Hava Durumu Modulu:
weather.current()
HTTP sorğusu edir.- Əgər sorğu uğurlu olarsa, data toplayır və callback funksiyasını
null
səhv və nəticə olaraq temperaturla çağırır. - Əgər sorğu uğursuz olarsa, callback funksiyasını error ilə çağırır.
-
Nəticələri İdarəetmə:
- Əsas tətbiqdə callback funksiyası səhvləri yoxlayır.
- Əgər bir səhv varsa, onu idarə edir; əks halda, temperaturu işləyir və göstərir.
- Asinxron İcra (Asynchronous Execution): Node.js asinxron əməliyyatları idarə etmək üçün callback-lardan istifadə edir və bloklanmayan kod icrasını təmin edir.
- Səhv İdarəetməsi (Error Handling): Callback funksiyaları səhvləri yoxlayır və onları müvafiq şəkildə idarə edir.
- Callback Zənciri (Callback Chain): Bir callback nəticələri digərinə ötürərək məlumat və icra axınını davam etdirə bilər.
-
Callback-lar və Asinxron Sorğular: Node.js-də tətbiqinizdən kənarda (məsələn, xarici API-ə) sorğular etmək yaygındır. Callback-ların necə işlədiyini anlamaq vacibdir, çünki onlar bu asinxron əməliyyatların nəticələrini əsas axını bloklamadan idarə edirlər.
-
Anonim vs. Adlı Callback-lar: Callback-lar anonim və ya adlı ola bilər. Anonim callback-lar, sadəlik və oxunaqlılıq üçün tez-tez istifadə olunur, xüsusən də callback məntiqi başqa yerdə təkrar istifadə olunmadıqda.
Bir veb sayt qurduğunuzu düşünün ki, cari temperaturu göstərir. Temperaturu əldə etmək üçün xarici hava durumu API-ə sorğu göndərməlisiniz. Əsas axını API cavabını gözləyərkən bloklasanız, bu istifadəçilərin saytla qarşılıqlı əlaqəsini maneə törədərdi. Bunun əvəzinə, cavabı asinxron şəkildə idarə etmək üçün callback-dan istifadə edirsiniz.
- Sadəlik və Oxunaqlılıq (Simplicity and Readability): Anonim funksiyalar daha sadə və oxunaqlıdır, xüsusən də qısa, birdəfəlik istifadə olunan callback-lar üçün.
- Məntiqin Məhdudlaşdırılması (Scoped Logic): Geri çağırışCallback-in məntiqi funksiya çağırışının daxilində saxlanılır və bu, kodun izlənməsini asanlaşdırır.
- Arrow Funksiyalar: Arrow sintaksisdən (
=>
) istifadə edərək, kodu daha da qısa edə bilərsiniz.
Callback-ların, xüsusən anonim olanların, istifadəsini anlamaq Node.js-də asinxron proqramlaşdırmanı mənimsəmək üçün vacibdir. Onlar tətbiqinizin asinxron əməliyyatları effektiv şəkildə idarə etməsinə imkan verir, istifadəçi təcrübəsini cavabdeh və performanslı saxlayır. Anonim callback-lardan istifadə edərək, callback məntiqi sadə və təkrar istifadə olunmadıqda kodu təmiz və idarə edilə bilən saxlayırsınız.
Callback, başqa bir funksiyaya arqument olaraq ötürülən və nəticə əldə edildikdən sonra icra olunan funksiyadır. Callbacklər asinxron JavaScript üçün vacibdir, funksiyanın yalnız tələb olunan iş tamamlandıqdan sonra işləməsini təmin edir.
function message() {
console.log("Bu mesaj 3 saniyədən sonra göstərilir");
}
setTimeout(message, 3000);
Bu nümunədə message
setTimeout
funksiyasına ötürülən callback funksiyasıdır. 3 saniyə gözlədikdən sonra, setTimeout
message
funksiyasını icra edir.
Callbacklər tez-tez aşağıdakı işlər üçün istifadə olunur:
- Məlumat bazasından dəyərlərə giriş
- Şəkillərin yüklənməsi
- Faylların oxunması
Bu işlər tez-tez xarici xidmətlər tərəfindən təmin olunan resursları əhatə edir və callbacklər bu resurslar mövcud olana qədər gözləyir.
Callbacklərdən ardıcıl tapşırıqları icra etmək üçün istifadə edərkən, funksiyalar bir-birinin içində iç-içə hala gələ bilər, bu da mürəkkəb və oxunması çətin koda səbəb olur. Bu "Callback Cəhənnəmi" və ya "Piramida Effekti" kimi tanınır. Məsələn, tort bişirmək asinxron tamamlanamayan ardıcıl addımları əhatə edir:
- Tortun tərkiblərini alın.
- Tərkibləri qarışdırın.
- Tortu bişirin.
- Tortu bəzəyin.
- Tortu təqdim edin.
Kodda bu belə görünə bilər:
purchaseIngredients(function(ingredients) {
combineIngredients(ingredients, function(mixture) {
bakeCake(mixture, function(cake) {
decorateCake(cake, function(decoratedCake) {
serveCake(decoratedCake);
});
});
});
});
İdarəetmənin inversiyası, nəzarətin kodunuzun xaricində olmasıdır. Callbacklərlə, nəzarət tez-tez üçüncü tərəf koduna verilir, bu da bir neçə problemi gətirə bilər:
- Çoxlu Çağırışlar (Multiple Calls): Callback bir neçə dəfə çağırıla bilər (məsələn, bir istifadəçi düyməni bir neçə dəfə basdıqda).
- Qaçırılmış Çağırışlar (Missed Calls): Callback ümumiyyətlə çağırılmaya bilər.
- Vaxtlama Problemləri (Timing Issues): Callback çox erkən və ya çox gec çağırıla bilər.
- Kontekst İtirmək (Context Loss): Callback kontekstini itirə bilər və ya səhv arqumentləri geri qaytara bilər.
Bir üçüncü tərəf kodunda səhv olduğunu və callbackin bir neçə dəfə çağırıldığını düşünək:
let isProcessing = false;
function processClick() {
if (!isProcessing) {
isProcessing = true;
// Kartı ödə
chargeCard(function(err, result) {
if (err) {
// Səhvi idarə et
} else {
// Nəticəni idarə et
}
isProcessing = false;
});
}
}
button.addEventListener('click', processClick);
Bu nümunədə isProcessing
kartın yalnız bir dəfə ödənməsini təmin edir, düymə bir neçə dəfə basılsa belə. Ancaq, callback heç vaxt çağırılmadıqda əlavə məntiq tələb olunur, bu da kodu daha mürəkkəbləşdirir.
Callback cəhənnəmini və etibar problemlərini (trust issues) azaltmaq üçün bir neçə strategiya var:
- Şərhlər Yazmaq: Kodun axışını izah etmək üçün şərhlər əlavə etmək.
- Funksiyaları Bölmək: Böyük funksiyaları daha kiçik, idarə edilə bilən funksiyalara bölmək.
- Promises İstifadə Etmək: Promiselər asinxron əməliyyatları idarə etmək üçün daha oxunaqlı bir yol təmin edir.
- Async/Await İstifadə Etmək: Async/await sintaksisi asinxron kodu idarə etməyi daha da sadələşdirir.
- Callbacklər asinxron JavaScript üçün vacibdir.
- "Callback cəhənnəmi" callback funksiyalarının iç-içə olmasına və kod oxunaqlılığını və saxlanmasını çətinləşdirir.
- İdarəetmənin inversiyası problemləri üçüncü tərəf koduna etibar edərkən yaranır.
- Bu problemləri azaltmaq üçün şərhlər yazmaq, funksiyaları bölmək və Promiselər və ya async/await istifadə etmək kimi strategiyalar mövcuddur.
Promise, asinxron əməliyyatın sonunda əldə olunacaq nəticəni (və ya uğursuzluğu) təmsil edən obyektdir. Promiselərin üç vəziyyəti var:
- Pending (Gözlənilir): Promise-in ilkin vəziyyəti.
- Resolved (Həll olunmuş): Asinxron əməliyyatın uğurla tamamlandığı vəziyyət.
- Rejected (Rədd edilmiş): Asinxron əməliyyatın uğursuz olduğu vəziyyət.
Promise-i Promise
konstruktorundan (constructor) istifadə edərək yarada bilərsiniz.
fayl oxumaq üçün promise istifadə olunan bir nümunə:
const fs = require('fs');
function readFile(filename) {
return new Promise((resolve, reject) => {
fs.readFile(filename, 'utf8', (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
// İstifadə nümunəsi:
readFile('example.txt')
.then(data => console.log(data))
.catch(err => console.error(err));
Bu nümunədə, readFile
faylın məzmununu oxuyan bir promise qaytarır. Əgər fayl uğurla oxunursa, promise faylın məlumatı ilə həll olunur. Əgər səhv varsa, promise səhvlə rədd edilir.
HTTP sorğuları API-lərlə işləyərkən promislər üçün ümumi istifadə halıdır. Node.js-də axios
paketi HTTP sorğularını promislərə bükən populyar bir kitabxanadır.
Burada axios
istifadə olunan bir nümunə:
const axios = require('axios');
// GET sorğusu etmək
axios.get('https://jsonplaceholder.typicode.com/todos/1')
.then(response => {
console.log('Həll olundu:', response.data);
})
.catch(error => {
console.error('Rədd edildi:', error.message);
});
Bu nümunədə, axios.get
promise qaytarır. Promise HTTP sorğusu tamamlanana qədər gözlənilir vəziyyətdədir. Əgər sorğu uğurla tamamlanırsa, promise həll olunur və .then
metodu cavab məlumatı ilə çağırılır. Əgər sorğu uğursuz olursa, promise rədd edilir və .catch
metodu səhvlə çağırılır.
- Oxunaqlılığın Təkmilləşdirilməsi (Improved Readability): Promislər, dərin iç-içə callback-lərlə müqayisədə, daha oxunaqlı və saxlanması asan olan asinxron kod yazmağa imkan verir.
- Zəncirləmə (Chaining): Promislər zəncirlənə bilər, bu da ardıcıl asinxron əməliyyatları yerinə yetirməyə imkan verir.
- Səhvlərin İdarə Edilməsi (Error Handling): Promislər
.catch
istifadə edərək səhvləri təmiz bir şəkildə idarə etməyə imkan verir.
const fs = require('fs').promises;
function readFile(filename) {
return fs.readFile(filename, 'utf8');
}
function writeFile(filename, data) {
return fs.writeFile(filename, data);
}
// Promislərin zəncirlənməsi
readFile('example.txt')
.then(data => {
console.log('Fayl məzmunu:', data);
return writeFile('example_copy.txt', data);
})
.then(() => {
console.log('Fayl uğurla kopyalandı');
})
.catch(err => {
console.error('Səhv:', err.message);
});
Bu nümunədə, readFile
və writeFile
promislər qaytarır. Promislər faylı oxumaq və sonra məzmununu başqa bir fayla yazmaq üçün zəncirlənir. Əgər hər hansı əməliyyat uğursuz olursa, səhv .catch
metodunda tutulur.
- Promise, asinxron bir metod tərəfindən qaytarılan və əməliyyatın nəhayət tamamlanmasını və ya uğursuzluğunu təmsil edən obyektdir.
- Promise-in ilkin vəziyyəti gözləniləndir.
- Promislər həll oluna (uğurlu) və ya rədd edilə bilər.
- Node.js-də
axios
paketi HTTP sorğularını idarə etmək üçün geniş istifadə olunur və promislər qaytarır. - Promislər kodun oxunaqlılığını artırır, asinxron əməliyyatların zəncirlənməsinə imkan verir və səhvlərin idarə edilməsini təmiz bir şəkildə təmin edir.
JSON (JavaScript Object Notation) insan üçün oxunması və yazılması asan, maşınlar üçün isə təhlil edilməsi və yaradılması asan olan yüngül məlumat mübadiləsi formatıdır. JSON veb inkişafında server və müştəri arasında məlumat mübadiləsi üçün geniş istifadə olunur.
Node.js JSON məlumatları ilə işləmək üçün iki əsas metodu təmin edir:
- JSON.parse(): JSON sətirini JavaScript obyektinə çevirir.
- JSON.stringify(): JavaScript obyektini JSON sətirinə çevirir.
JSON sətirini JavaScript obyektinə təhlil etmək üçün JSON.parse()
metodundan istifadə edə bilərsiniz.
const jsonString = '{"Company": "ABB", "Country": "AZE", "Headquarters": "28 May, Baku"}';
const jsonObject = JSON.parse(jsonString);
console.log(jsonObject);
// Çıxış: { Company: 'ABB', Country: 'AZE', Headquarters: '28 May, Baku' }
JavaScript obyektini JSON sətirinə çevirmək üçün JSON.stringify()
metodundan istifadə edə bilərsiniz. Burada bir nümunə var:
const jsonObject = {
Company: "ABB",
Country: "AZE",
Headquarters: "28 May, Baku"
};
const jsonString = JSON.stringify(jsonObject);
console.log(jsonString);
// Çıxış: {"Company":"ABB","Country":"AZE","Headquarters":"28 May, Baku"}
JSON məlumatları qaytaran həqiqi API endpoint-dən istifadə nümunəsini görək. Hal-hazırda kosmosda olan astronavtlar haqqında məlumat verən bir API-ə HTTP sorğusu etmək üçün axios
paketindən istifadə edəcəyik.
Əvvəlcə axios
paketini quraşdırın:
npm install axios
Sonra API-dən JSON məlumatları götürmək və təhlil etmək üçün aşağıdakı kodu istifadə edin:
const axios = require('axios');
const url = 'http://api.open-notify.org/astros.json';
axios.get(url)
.then(response => {
const data = response.data;
console.log('Astronavtların sayı:', data.number);
console.log('Astronavtlar:', data.people);
})
.catch(error => {
console.error('Məlumatın götürülməsində səhv:', error);
});
Bu nümunədə:
- Biz
axios.get(url)
istifadə edərək API endpoint-nə HTTP GET sorğusu edirik. - Cavab JSON məlumatları ehtiva edir və
axios
tərəfindən avtomatik olaraq təhlil edilir. - Biz astronavtların sayını və astronavtların siyahısını konsola yazdırırıq.
- JSON API məlumat mübadiləsi üçün standart formatdır və JavaScript-də təbii olaraq dəstəklənir.
JSON.parse()
JSON sətirini JavaScript obyektinə çevirir.JSON.stringify()
JavaScript obyektini JSON sətirinə çevirir.- Node.js-də
axios
kimi kitabxanalardan istifadə edərək API-lərdən JSON məlumatları götürə və onları asanlıqla idarə edə bilərsiniz.
JSON (JavaScript Object Notation) məlumat seriyalizasiyası üçün standartdır və API-lərin istehlakı və yaradılması, layihə tələblərinin təyin edilməsi və yerləşdirmələrin idarə edilməsi üçün kritikdir.
-
JavaScript-də JSON:
- JSON JavaScript-ə daxil edilib və JavaScript obyektləri ilə işlədiyiniz zaman, əslində JSON ilə işləyirsiniz.
- JSON obyektləri sətir formatına kodlamaq və onları yenidən JavaScript obyektlərinə dekod etmək üçün istifadə olunur.
-
Ümumi İstifadə Halları:
- API-lər: JSON RESTful veb xidmətlərində ünsiyyət üçün ümumi formatdır.
- Konfiqurasiya: JSON layihə tələblərini, xidmət olaraq platforma təkliflərini və Kubernetes iş yüklərini təyin etmək üçün istifadə olunur.
- Verilənlər Bazaları: JSON MongoDB kimi JSON-yönümlü sənəd verilənlər bazalarında istifadə olunur.
-
JSON ilə İşləmək üçün Metodlar:
JSON.parse()
: JSON sətirini JavaScript obyektinə çevirir.JSON.stringify()
: JavaScript obyektini JSON sətirinə çevirir.
- Uyğunluq: JSON çoxlu proqramlaşdırma dilləri, o cümlədən Python tərəfindən dəstəklənir və onu məlumat mübadiləsi üçün çox yönlü seçim edir.
- İstifadə Asanlığı: JSON-un sadə strukturu onu oxumağı və yazmağı asanlaşdırır.
- Uyğunluq: JSON müasir veb texnologiyaları tərəfindən istifadə olunur, bu da onu inkişaf etdiricilər üçün dəyərli bir bacarıq halına gətirir.
JavaScript single-threaded skript dilidir, yəni proseslər eyni zamanda deyil, ardıcıl olaraq baş verir. Bu məhdudiyyət Promises vasitəsilə həll olundu. Promises sinxron proqramlaşdırma problemlərini həll etsə də, dərinləşmiş then
çağırışları kodun strukturunu və oxunaqlığını mürəkkəbləşdirə bilər.
ES2017-də async/await
təqdim olundu, bu, daha təmiz və oxunaqlı asinxron kod yazmaq üçün bir yol təqdim edir. Bir promise-ni gözləməklə, promise yerinə yetirildikdə nəticəni emal edə və ya promise rədd edildikdə hər hansı bir səhvlə başa çıxa bilərsiniz.
Burada API sorğusunu idarə etmək üçün Promises istifadə olunan bir nümunə var:
const axios = require('axios');
const connectToURL = (url) => {
const req = axios.get(url);
req.then(resp => {
let listOfEntries = resp.data.entries;
listOfEntries.forEach((entry) => {
console.log(entry.Category);
});
})
.catch(err => {
console.log(err.toString());
});
}
console.log("Before connect URL");
connectToURL('https://api.publicapis.org/entries');
console.log("After connect URL");
Eyni nümunə daha yaxşı oxunaqlıq üçün async/await
istifadə olunaraq yerinə yetirilə bilər:
const axios = require('axios');
const connectToURL = async (url) => {
try {
const response = await axios.get(url);
const listOfEntries = response.data.entries;
listOfEntries.forEach((entry) => {
console.log(entry.Category);
});
} catch (error) {
console.error(error.toString());
}
}
console.log("Before connect URL");
connectToURL('https://api.publicapis.org/entries');
console.log("After connect URL");
Async/await
ardıcıl olaraq baş verməli olan bir neçə asinxron fəaliyyəti idarə edərkən özünü göstərir. Burada əvvəlcə girişlərin siyahısını aldığımız və sonra "A" ilə başlayan hər bir kateqoriya üçün təfərrüatları gətirdiyimiz bir nümunə var:
const axios = require('axios');
async function connectToURL(url) {
try {
const response = await axios.get(url);
const listOfEntries = response.data.entries;
let categories = new Set();
// Unikal kateqoriyaları çıxar
listOfEntries.forEach((entry) => {
categories.add(entry.Category);
});
// "A" ilə başlayan hər bir kateqoriya üçün təfərrüatları sorğu et
for (let category of categories) {
if (category.startsWith("A")) {
const resp = await axios.get(`https://api.publicapis.org/entries?Category=${category}`);
console.log(`${category} - ${resp.data.count}`);
}
}
} catch (error) {
console.error(error.toString());
}
}
connectToURL('https://api.publicapis.org/entries');
const axios = require('axios');
async function connectToURL(url) {
try {
const resp = await axios.get(url);
let listOfEntries = resp.data.entries;
let Categories = listOfEntries.map((entry) => entry.Category);
Categories = [...new Set(Categories)];
for (let Category of Categories) {
if (Category.startsWith("A")) {
try {
const resp = await axios.get(`https://api.publicapis.org/entries?Category=${Category}`);
console.log(`${Category} - ${resp.data.count}`);
} catch (e) {
console.log(e);
}
}
}
} catch (err) {
console.log(err.toString());
}
}
connectToURL('https://api.publicapis.org/entries');
- Siz yalnız
async
funksiyasındaawait
istifadə edə bilərsiniz, çünkiawait
ipi (thread) promise yerinə yetirilənə qədər bloklayır. Async/await
bir neçə ardıcıl olaraq yerinə yetirilməsi lazım olan asinxron əməliyyatlarla məşğul olarkən daha təmiz, oxunaqlı kod yazmağa kömək edir.
Node.js ilə HTTP server yaratmaq sadədir, lakin default Node.js frameworku məhdud imkanlara malikdir. Routing, daxil olan faylların parse edilməsi, autentifikasiya və verilənlər bazası bağlantıları kimi web server funksionallığının bir çox aspekti üçün Node.js-nin əsas imkanlarını genişləndirmək üçün xarici kitabxanalara və paketlərə ehtiyac var.
San Francisco Beynəlxalq Hava Limanı üçün hava məlumatlarına ehtiyac olduğunu düşünək. Bu məlumatları əldə etmək üçün xarici bir web serverə HTTP sorğusu göndərə və alınan məlumatları manual olaraq parse edə bilərik.
- Hava məlumatları serverinə HTTP sorğusu göndərin.
- XML cavabını string kimi parse edin.
- XML cavabından temperatur məlumatlarını çıxarın.
JavaScript string funksiyalarından istifadə edən sadə yanaşma:
const http = require('http');
const options = {
hostname: 'example.com',
port: 80,
path: '/weather',
method: 'GET'
};
const req = http.request(options, (res) => {
let buffer = '';
res.on('data', (chunk) => {
buffer += chunk;
});
res.on('end', () => {
const matches = buffer.match(/<temp_f>(.*?)<\/temp_f>/);
if (matches) {
const temperature = matches[1];
console.log(`Temperature: ${temperature}`);
} else {
console.log('Temperature data not found');
}
});
});
req.on('error', (e) => {
console.error(`Problem with request: ${e.message}`);
});
req.end();
- XML Strukturunu Nəzərə Almır (Ignores XML Structure): String uyğunlaşdırma XML məlumat strukturunu nəzərə almır, bu da onu daha az etibarlı edir.
- Səhv Yaratma Riski (Error-Prone): Zədələnmiş XML məlumatları səhvlərə səbəb ola bilər.
- Effektiv Deyil (Inefficient): Kompleks XML məlumatları üçün XML ağacının qurulması string uyğunlaşdırmadan daha effektivdir.
- Baxım (Maintenance): XML strukturundakı dəyişikliklər regular ifadənin yenilənməsini tələb edir.
Daha güclü bir yanaşma xml2js
paketindən istifadə edərək XML məlumatlarını JavaScript obyektinə parse etməkdir. Bu paket tamamilə JavaScript ilə yazılmışdır və xarici XML parsinq kitabxanalarına ehtiyac yoxdur.
xml2js
paketindən istifadə etmək üçün onu npm vasitəsilə quraşdırmalısınız:
npm install xml2js
Budur, XML məlumatlarını xml2js
ilə necə parse etmək olar:
const http = require('http');
const xml2js = require('xml2js');
const options = {
hostname: 'example.com',
port: 80,
path: '/weather',
method: 'GET'
};
const req = http.request(options, (res) => {
let buffer = '';
res.on('data', (chunk) => {
buffer += chunk;
});
res.on('end', () => {
xml2js.parseString(buffer, (err, result) => {
if (err) {
console.error('Failed to parse XML:', err);
return;
}
const temperature = result.current_observation.temp_f[0];
console.log(`Temperature: ${temperature}`);
});
});
});
req.on('error', (e) => {
console.error(`Problem with request: ${e.message}`);
});
req.end();
- Üçüncü Tərəf Paketləri: İnkişaf etdiricilər Node.js funksionallığını
xml2js
kimi üçüncü tərəf paketlərindən istifadə edərək genişləndirirlər. - String Parsinqi: XML məlumatlarının string parsinqi səhvlərə meyillidir və məlumat strukturunu nəzərə almır.
- xml2js: Bu paket XML stringlərini JavaScript obyektlərinə çevirir, XML məlumatları ilə işləməyi asanlaşdırır.
- npm: Node.js paketlərini idarə etmək üçün npm tətbiqindən istifadə edin və layihəniz üçün lazım olan asılılıqların olduğunu təmin edin.
Node.js-də üçüncü tərəf paketlərdən istifadə inkişafı əhəmiyyətli dərəcədə sadələşdirir, layihələrin tamamlanmasını sürətləndirir və funksionallığı artırır. Geniş istifadə olunan bəzi paketlər və onların üstünlükləri:
Serverless Framework buludda serverless mikroxidmətləri geniş infrastruktur koduna ehtiyac olmadan yerləşdirməyə imkan verir. Serverless tətbiqlərinin yaradılmasını, konfiqurasiyasını və yerləşdirilməsini sadələşdirir, bulud inkişafını daha əlçatan və effektiv edir.
Lodash arraylər, obyektlər və digər kolleksiyalar üzərində işləmək üçün çoxsaylı funksiyalar təqdim edən utilitar kitabxanadır. Elementlərin tapılması, məlumatların sıralanması və kolleksiyaların manipulyasiyası kimi tapşırıqları sadələşdirir, inkişaf etdiricilərə vaxt və səylərini qənaət etdirir.
Axios, RESTful API-lərlə qarşılıqlı əlaqəni asanlaşdıran promise-based HTTP müştərisidir. GET, POST, PUT, DELETE və digər HTTP metodlarını dəstəkləyir və promise və async/await üçün daxilində dəstəklə sorğuların və cavabların idarə edilməsini sadələşdirir.
Express tətbiqləri tez-tez müxtəlif funksionallıqlar üçün middleware-lərdən asılıdır, o cümlədən:
- Autentifikasiya: JSON Web Tokens (JWT) kimi autentifikasiya üçün middleware web tətbiqlərinin təhlükəsizliyini sadələşdirir.
- Body Parsing:
body-parser
kimi middleware-lər daxil olan sorğu body-lərini işləyir, form təqdimatları və JSON məlumatlarının idarə edilməsini asanlaşdırır. - Logging:
morgan
kimi middleware-lər HTTP sorğularını qeydə alır, debugging və monitorinqdə kömək edir.
Bir Node.js tətbiqində Axios və Lodash-dan necə istifadə edə bilərsiniz:
const axios = require('axios');
const _ = require('lodash');
// Public API-dən məlumatların əldə edilməsi
async function fetchData(url) {
try {
const response = await axios.get(url);
const data = response.data;
// Lodash istifadə edərək məlumatları filtr edin və sıralayın
const filteredData = _.filter(data.entries, entry => entry.Category === 'Animals');
const sortedData = _.sortBy(filteredData, 'API');
sortedData.forEach(entry => {
console.log(`API: ${entry.API}, Description: ${entry.Description}`);
});
} catch (error) {
console.error(`Error fetching data: ${error}`);
}
}
fetchData('https://api.publicapis.org/entries');
Verilənlər bazaları ilə işləyərkən, NPM paketləri həm relasional, həm də NoSQL bazaları ilə qarşılıqlı əlaqəni sadələşdirir. Populyar bəzi paketlərə aşağıdakılar daxildir:
- Sequelize: PostgreSQL, MySQL və SQLite kimi SQL bazaları üçün ORM.
- Mongoose: MongoDB üçün ODM, sxem dizaynını və məlumat doğrulamasını sadələşdirir.
- Knex.js: Müxtəlif relasional verilənlər bazaları üçün SQL sorğu qurucusu, ORM-lərdən daha çevik yanaşma təklif edir.
Mongoose istifadə edərək MongoDB bazası ilə necə qarşılıqlı əlaqə qurmaq olar:
const mongoose = require('mongoose');
// Bazaya qoşulma
mongoose.connect('mongodb://localhost/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });
// Sxem təyin edilməsi
const userSchema = new mongoose.Schema({
name: String,
email: String,
password: String
});
// Model yaradılması
const User = mongoose.model('User', userSchema);
// Yeni istifadəçinin yaradılması və saxlanması
const newUser = new User({ name: 'John Doe', email: 'john.doe@example.com', password: 'securepassword' });
newUser.save((err) => {
if (err) {
console.error('Error saving user:', err);
} else {
console.log('User saved successfully');
}
// Bazanın əlaqəsinin bağlanması
mongoose.connection.close();
});
Üçüncü tərəf Node.js paketlərindən istifadə inkişaf səmərəliliyini artırır və inkişaf etdiricilərə dayanıqlı, miqyaslana bilən tətbiqlər yaratmağa imkan verir. Serverless Framework, Lodash, Axios və verilənlər bazası konnektorları kimi paketlər ümumi tapşırıqları sadələşdirir və müasir web tətbiqləri yaratmaq üçün güclü alətlər təqdim edir.
Node.js tez-tez web framework kimi qarışdırılır, lakin əslində server tərəfində JavaScript kodunu icra edən runtime mühitdir. Bu, brauzer xaricində JavaScript tətbiqlərini işlətmək üçün zəruri infrastrukturu təmin edir, developerlərə server tərəfində tətbiqlər yaratmağa imkan verir. Bunun əksinə olaraq, veb framework veb tətbiqlərini inkişaf etdirmək üçün strukturlaşdırılmış bir yol təqdim edən alətlər və kitabxanalar toplusudur. Veb frameworklər adətən yönləndirmə (routing), middleware, verilənlər bazası qarşılıqlı əlaqəsi (database interaction) və digər komponentlər üçün funksiyalar təqdim edir.
Node.js ilə veb tətbiqlər yaratmaq üçün developlər tez-tez əlavə alətlər və abstraksiyalar təmin edən veb frameworklərdən istifadə edirlər. Bu frameworklər əvvəlcədən təyin edilmiş strukturlar və ümumi funksionallıqlar təklif edərək inkişafı sürətləndirir və developlərə tətbiqin unikal xüsusiyyətlərinə daha çox diqqət yetirməyə imkan verir.
Veb developmentdə 2 ümumi arxitektura nümunəsi istifadə olunur: Model-View-Controller (MVC) və Representational State Transfer (REST) API-ləri. Bu nümunələr tətbiqin tələblərindən asılı olaraq birlikdə və ya ayrı-ayrılıqda istifadə edilə bilər.
MVC tətbiqi üç komponentə ayıran bir arxitektura nümunəsidir:
- Model: Tətbiqin məlumatlarını və iş məntiqini idarə edir. O, verilənlər bazası ilə qarşılıqlı əlaqədə olur və məlumat manipulyasiyasını həyata keçirir.
- View: Məlumatı istifadəçiyə təqdim etməkdən məsuldur. Model tərəfindən təmin edilən məlumatlar əsasında istifadəçi interfeysini göstərir.
- Controller: Model və view arasında vasitəçi rolunu oynayır. İstifadəçi girişlərini emal edir, modeli yeniləyir və göstəriləcək view-u müəyyən edir.
MVC arxitekturasını dəstəkləyən frameworklərə aşağıdakılar daxildir:
- Express: Veb tətbiqlər və API-lər yaratmaq üçün geniş istifadə olunan minimalist və çevik Node.js veb frameworkü. O, MVC nümunəsini dəstəkləyir və müxtəlif middleware seçimləri təklif edir.
- Koa: Express-in arxasında duran komanda tərəfindən hazırlanmışdır, Koa daha kiçik və daha ifadəli olmaq üçün nəzərdə tutulmuşdur. Asinxron əməliyyatları idarə etmək üçün async funksiyalarından istifadə edir və səhv idarə edilməsinə daha müasir yanaşma təklif edir.
- NestJS: Ölçeklenebilir (scalable) server tərəfli tətbiqlər yaratmaq üçün bir framework. TypeScript istifadə edir və Angular ilə yaxşı inteqrasiya olunur, onu full-stack tətbiqlər yaratmaq üçün uyğun edir. O, MVC nümunəsini izləyir və obyekt yönümlü və funksional reaktiv proqramlaşdırmanı dəstəkləyir.
REST (Representational State Transfer) şəbəkə tətbiqlərinin dizaynı üçün arxitektura üslubudur. REST API-ləri standart HTTP metodlarından istifadə edərək, GET, POST, PUT, PATCH və DELETE kimi müxtəlif veb xidmətləri arasında ünsiyyəti təmin edir. REST-in əsas prinsiplərinə daxildir:
- Statelessness: Müştəridən serverə hər sorğu sorğunu anlamaq və emal etmək üçün lazım olan bütün məlumatları ehtiva etməlidir. Server sorğular arasında müştəri vəziyyətini saxlamır.
- Müştəri-Server Ayrımı (Client-Server Separation): Müştəri və server müstəqil fəaliyyət göstərir, müstəqil yeniləmələrə və miqyaslanmaya imkan verir.
- Resurs Mərkəzli (Resource-Based): Resurslar (məlumat obyektləri kimi) URL-lərlə təmsil olunur və bu resurslar üzərində əməliyyatlar HTTP metodlarından istifadə etməklə həyata keçirilir.
-
Express.js:
- Güclü Cəhətləri: Geniş istifadə olunur, geniş middleware dəstəyi, sadəlik və çeviklik.
- İstifadə Halları: Veb tətbiqlər, RESTful API-lər və mikroxidmətlər.
-
Koa:
- Güclü Cəhətləri: Müasir dizayn, async/await istifadə edir, yüngüldür.
- İstifadə Halları: Yüksək performanslı və mürəkkəb tətbiqlər.
-
Socket.io:
- Güclü Cəhətləri: Müştərilər və serverlər arasında real-time iki istiqamətli ünsiyyət, WebSocket dəstəyi.
- İstifadə Halları: Chat tətbiqləri, canlı yeniləmələr, çox oyunçu oyunları.
-
Hapi.js:
- Güclü Cəhətləri: Təhlükəsizlik yönümlü, zəngin plugin sistemi, konfiqurasiya yönümlü.
- İstifadə Halları: API serverləri, HTTP-proxy tətbiqləri.
-
NestJS:
- Güclü Cəhətləri: TypeScript dəstəyi, modul arxitektura, Angular ilə inteqrasiya.
- İstifadə Halları: Müəssisə tətbiqləri, genişlənə bilən server tərəfli tətbiqlər.
Express, Node.js runtime mühitinin üzərində qurulmuş populyar veb tətbiq frameworküdür. Bu, HTTP sorğularını və cavablarını idarə etməyi, middleware-ləri idarə etməyi və aşağı səviyyəli detalları abstracting edərək web inkişaf sadələşdirir. Bu abstraksiya inkişaf etdiricilərə tətbiqlərini daha səmərəli təşkil etməyə və inkişaf prosesini sürətləndirməyə imkan verir.
-
Middleware İnteqrasiyası: Express, loglama, autentifikasiya, məlumatların parsinqi və digər tapşırıqları yerinə yetirmək üçün istifadə oluna bilən middleware paketlərini inteqrasiya etmək üçün güclü mexanizmlər təmin edir. Middleware funksiyaları hər bir gələn sorğu üçün ardıcıl olaraq icra olunur, bu da inkişaf etdiricilərə tətbiq məntiqini modullaşdırmağa və idarə etməyə imkan verir.
-
HTTP Sorğularının İdarə Edilməsi: Express bütün HTTP metodlarını (GET, POST, PUT, DELETE və s.) dəstəkləyir və müxtəlif endpointlər üçün route handlerlərini müəyyən etmək üçün sadə sintaksis təmin edir. Bu, yaxşı müəyyən edilmiş routelar və sorğu idarəetməsi ilə API-lər və veb tətbiqlər yaratmağı asanlaşdırır.
-
Şablon Mühərrikləri və SSR (Template Engines and SSR: Express şablonları quraraq server tərəfində render (SSR) üçün istifadə edilə bilər. Bu, SEO dostu tətbiqlər yaratmaq və ilkin səhifənin yüklənmə vaxtlarını yaxşılaşdırmaq üçün xüsusilə faydalıdır.
-
API İnkişafı: Express adətən RESTful API-lər yaratmaq üçün istifadə olunur, burada o, məlumat qatı (data layer) ilə qarşılıqlı əlaqə üçün interfeys kimi fəaliyyət göstərir. Bu, JSON formatında məlumatı
res.json
metodu ilə müştəriyə geri göndərir, bu da API-lərin qurulmasını və istifadə edilməsini asanlaşdırır.
Express tətbiqini qurmaq üçün bu beş addımı yerinə yetirin:
-
Express-i Asılılıq Kimi Elan Edin (Declare Express as a Dependency): Layihə qovluğunuzda
package.json
faylı yaradın və buraya Express daxil olmaqla asılılıqları əlavə edin. Bu fayl modulun metadata-sını, məsələn, ad, versiya, təsvir, əsas skript və asılılıqları (dependencies) təsvir edir. -
npm Install Komandası İcra Edin:
npm install
komandasından istifadə edərək elan edilmiş asılılıqları (dependencies), o cümlədən Express-i yükləyin və quraşdırın. Bu komandapackage.json
faylını oxuyur və zəruri modullarınode_modules
qovluğuna quraşdırır. -
Express Tətbiqini İdxal Edin və Yaradın: Əsas JavaScript faylınızda (məsələn,
app.js
) Express modulunu idxal edin və Express tətbiqi nümunəsi yaradın. Bu nümunə routelar və middleware qurmaq üçün istifadə olunacaq. -
Route Handlers Yaradın: Fərqli endpointlər üçün
app.get
,app.post
və s. kimi metodlardan istifadə edərək route handlers təyin edin. Hər bir route handler müəyyən bir endpointə sorğu göndərildikdə yerinə yetiriləcək məntiqi müəyyən edir. -
HTTP Serveri Başladın: Müəyyən edilmiş port nömrəsi ilə
app.listen
metodunu çağıraraq serveri başladın. Bu metod verilmiş portda əlaqələri bağlayır və dinləyir, serverin sorğuları qəbul etməyə başlamasına imkan verir.
// package.json
{
"name": "temperature",
"version": "1.0.0",
"description": "Amerika Birləşmiş Ştatlarında mövcud hava şəraitini əldə edin.",
"main": "app.js",
"dependencies": {
"express": "^4.0.0"
}
}
// app.js
const express = require('express');
const app = express();
// Əsas ana səhifə üçün marşrut işləyicisi təyin edin
app.get('/', (req, res) => {
res.send('Hello World!');
});
// Serveri 3000 portunda başladın
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
İlk olaraq, layihənizin package.json
faylında Express-i asılılıq kimi elan etməlisiniz. Bu fayl layihənin asılılıqlarını və metadata-sını idarə edir. Əgər package.json
faylınız yoxdursa, layihə qovluğunuzda aşağıdakı əmr vasitəsilə birini yarada bilərsiniz:
npm init -y
Daha sonra, Express-i asılılıq kimi əlavə edin:
{
"name": "my-express-app",
"version": "1.0.0",
"description": "Sadə bir Express veb tətbiqi",
"main": "mynodeserver.js",
"dependencies": {
"express": "^4.0.0"
}
}
package.json
faylında qeyd olunan Express modulu və digər asılılıqları quraşdırmaq üçün aşağıdakı əmri icra edin:
npm install
Bu, node_modules
adlı bir qovluq yaradacaq və Express və onun asılılıqlarını bu qovluğa quraşdıracaq.
3. Express Modulunu İdxal Edin və Express Tətbiqi Yaradın (Import the Express Module and Create an Express Application)
Layihə qovluğunuzda mynodeserver.js
kimi yeni bir JavaScript faylı yaradın. Bu faylda Express-i idxal edin və Express tətbiqi nümunəsi yaradın:
// mynodeserver.js
const express = require('express');
const app = express();
Gələn HTTP sorğularını idarə etmək üçün route handlerləri qurun. Bu nümunədə, hava məlumatını əldə etmək üçün bir route yaradacağıq. İşləyici URL-dən yer kodunu çıxaracaq və bir mesajla cavab verəcək:
app.get('/temperature/:location_code', (req, res) => {
const location = req.params.location_code;
// Hava məlumatını əldə etməyi simulyasiya edin
res.send(`Verilmiş yer üçün mövcud hava şəraiti: ${location}`);
});
Bu marşrutda, :location_code
bir route parametridir və req.params.location_code
vasitəsilə əldə edilə bilər.
Nəhayət, serveri müəyyən bir portda dinləyərək başladın. Burada biz 8080 portundan istifadə edirik:
app.listen(8080, () => {
console.log('Server işə düşdü: http://localhost:8080');
});
Express tətbiqinizi başlatmaq üçün terminalda aşağıdakı əmri icra edin:
node mynodeserver.js
Veb brauzerinizi açın və http://localhost:8080/temperature/some_location_code
ünvanına keçin (burada some_location_code
əvəzinə hər hansı bir mətn yerləşdirin). Siz verilmiş yer kodu üçün hava şəraitini göstərən bir mesaj görməlisiniz.
Express framework-ü Node.js üçün geniş yayılmış bir seçimdir və back-end veb tətbiqləri yaratmaq üçün effektivdir. Onun sintaksisi və yüksək səviyyəli API dizaynı, REST API endpointləri yaratmaq üçün xüsusi ilə faydalıdır. Bu frameworkün populyarlığı və güclü icması sayəsində müxtəlif middleware-lər inkişaf etdirilib və bunlar aşağıdakı kimi tapşırıqları sadələşdirir:
- Body məzmununun parse edilməsi:
body-parser
kimi middleware JSON və URL-encoded məlumatların asanlıqla parse edilməsinə imkan yaradır. - Autentifikasiya:
passport
kimi middleware müxtəlif autentifikasiya strategiyalarını dəstəkləyir. - İstifadəçi sessiyalarının idarə edilməsi:
express-session
kimi middleware sessiya məlumatlarını idarə edir. - Sorğu loglarının aparılması:
morgan
HTTP sorğularını log etmək üçün geniş yayılmış middleware-dir.
-
Populyarlıq və Ekosistem: Express Node.js üçün ən populyar frameworklərdən biridir. Bu populyarlıq, çoxlu sayda paket və middleware ilə zəngin ekosistemin inkişafına kömək edib ki, bu da inkişafı sürətləndirir.
-
Middleware çevikliyi: Express-də middleware nümunəsi tərtibatçılara sorğu və cavabları incə detallarla idarə etməyə imkan verir. Bu çeviklik, sorğu-cavab dövriyyəsinin müxtəlif nöqtələrində xüsusi məntiq və ya transformasiyaların tətbiq olunmasını mümkün edir.
-
Sürət və istifadənin asanlığı: Express sadəliyi və sürəti ilə tanınır. Tərtibatçılar sürətlə server qurub inkişaf etməyə başlaya bilərlər ki, bu da həm prototipləşdirmə, həm də istehsal mühitləri üçün idealdır.
-
Aşağı səviyyəli kodun abstraksiyası: Express istifadə edərək, tərtibatçılar HTTP sorğu və cavablarının işlənməsi üçün təkrarlanan kod yazmaqdan qaça bilərlər. Bunun əvəzinə, onlar tətbiq məntiqi və iş qaydalarına diqqət yetirə bilərlər.
-
Ən yaxşı təcrübələr: Express sənaye standartlarına uyğun olaraq hazırlanmışdır və təhlükəsiz və saxlanıla bilən tətbiqlərin qurulması üçün etibarlı əsas təmin edir.
-
Miqyaslama qabiliyyəti: Express miqyaslana bilən tətbiqlərin inkişafını dəstəkləyir. Həm front, həm də back tərəfdə JavaScript istifadə etməklə, tərtibatçılar istər front, istərsə də back tərəfdə eyni kodu istifadə edə bilərlər.
-
Performans: Google V8 mühərrikindən istifadə edərək, Express minimal gecikmə ilə yüksək performans təmin edə bilər və səmərəli icra və cavab vaxtlarını dəstəkləyir.
-
Keşləşdirmə: Express, keşləşdirmə dəstəyi ilə veb tətbiqlərin performansını artırır və hər sorğu üçün kodu yenidən icra etməyə ehtiyacı azaldır.
-
Üçüncü tərəf tətbiqləri ilə inteqrasiya: Express müxtəlif üçüncü tərəf tətbiqləri və xidmətləri ilə asanlıqla inteqrasiya edir və bu da onun funksionallığını və çevikliyini artırır.
Bir çox tərtibatçı, xüsusən back-end developmentə yeni başlayanlar, Express-in sadəliyi və mövcud geniş sənədlər və resurslar sayəsində əlçatan olduğunu düşünür. Daha çox infrastruktura dair məsələləri həll edən idarə olunan bulud xidmətlərini üstün tutan bəzi tərtibatçılar olsa da, Express back-end memarlığı üzərində daha çox nəzarət etmək istəyənlər üçün əla seçim olaraq qalır.
Ümumiyyətlə, Express.js Node.js ekosistemində back-end inkişafı üçün güclü bir vasitədir. O, sadəliyi və çevikliyi birləşdirərək tərtibatçılara möhkəm və miqyaslana bilən tətbiqlər yaratmağa imkan verir. İstər API-lər, istərsə də veb tətbiqləri yaradırsınızsa, ya da digər xidmətlər ilə inteqrasiya edirsinizsə, Express bu işi səmərəli şəkildə yerinə yetirmək üçün möhkəm bir əsas təmin edir.
Middleware paylanmış sistemdə müxtəlif komponentlər arasında əlaqə və məlumat idarəçiliyini təmin edən vasitəçi proqram təminatıdır. Bu, tətbiqlər, məlumat bazaları və xidmətlər arasında qarşılıqlı əlaqələri asanlaşdırır, istifadəçilər üçün problemsiz bir təcrübə təmin edir.
Express Node.js üçün populyar bir veb tətbiq frameworküdür və onun güclü yönləndirmə imkanları və middleware dəstəyi ilə tanınır. Express-də middleware funksiyaları HTTP sorğularını idarə etmək, məlumatları işləmək və cavablar yaratmaq üçün nəzərdə tutulub. Tətbiqin memarlığının mühüm bir hissəsini təşkil edir, modulyar və təkrar istifadə edilə bilən kod yaratmağa imkan verir.
Middleware-in Əsas Xüsusiyyətləri:
- Məlumatın İdarə Edilməsi: Middleware sorğu məlumatlarını işləyə bilər, məsələn, JSON bodylərini parse etmək və ya forma göndərişlərini idarə etmək.
- Sorğu/Cavab İdarəçiliyi: Sorğu və cavabları idarə edə bilər, loglama, autentifikasiya, səhvlərin idarə edilməsi və daha çox şey daxildir.
- Yönləndirmə: Middleware, URL və HTTP metodu əsasında sorğuları müvafiq idarəedici funksiyalara yönləndirə bilər.
Express və oxşar frameworklərdə front və back tərəf arasında ünsiyyət əsasən JSON və REST API-lər vasitəsilə aparılır. Bu, məlumat mübadiləsi üçün standart format və metod təmin edir, fərqli sistemlərin qarşılıqlı əlaqəsini asanlaşdırır. Daha köhnə çərçivələr oxşar məqsədlər üçün XML və SOAP-dan istifadə edə bilər.
Veb Xidmətləri və API-lər: Veb xidmətlər, o cümlədən REST API-lər, internet üzərindən tətbiqlərin ünsiyyəti üçün standart bir yol təmin edir. Bu xidmətlər HTTP metodlarından (məsələn, GET, POST, PUT, DELETE) istifadə edərək resurslarla qarşılıqlı əlaqə yaradır.
Veb server middleware rolunda çıxış edir, veb saytı məlumat bazasına bağlayır. Biznes məntiqini idarə edir, sorğuları işləyir və məlumatları uyğun şəkildə yönləndirir. Yönləndirmə gələn HTTP sorğularının, sorğunun URL-si və metoduna əsaslanaraq spesifik idarəedici funksiyalara xəritələnməsi prosesidir.
Yönləndirmə Funksiyaları:
- Router.get(): Məlumatları əldə etmək üçün HTTP GET sorğularını idarə edir.
- Router.post(): Yeni məlumatlar yaratmaq üçün HTTP POST sorğularını idarə edir.
- Router.put(): Mövcud məlumatları yeniləmək üçün HTTP PUT sorğularını idarə edir.
- Router.delete(): Məlumatları silmək üçün HTTP DELETE sorğularını idarə edir.
Bu router funksiyaları Express Router sinfinin bir hissəsidir və tətbiqdə routerları müəyyən etmək üçün istifadə olunur. Onlar iki əsas arqumenti qəbul edirlər:
- URL Yol: Sorğunun yönləndirildiyi son nöqtə.
- Geri Çağırış Funksiyası: Sorğunu idarə edən və cavab yaradan funksiya.
Yönləndirmədən əlavə, middleware müxtəlif digər vəzifələri yerinə yetirə bilər:
- Təhlükəsizlik: Təhlükəsiz ünsiyyəti təmin etmək üçün məlumatların şifrələnməsi və şifrəsinin açılması.
- Yük İdarəçiliyi (Load Management): Yükü balanslaşdırmaq və performansı artırmaq üçün gələn trafikin bir neçə server arasında paylanması.
- Məlumatın İdarə Edilməsi: Məlumatların müştəriyə qaytarılmadan əvvəl filtrasiya, sıralama və ya dəyişdirilməsi.
Express-də middleware, tətbiqlərin qurulması üçün modulyar yanaşma təmin edir və tərtibatçılara təmiz, saxlanıla bilən və təkrar istifadə edilə bilən kod yaratmağa imkan verir. Bu, tətbiqin iş prosesinin müxtəlif aspektlərini, sadə məlumat parse edilməsindən mürəkkəb təhlükəsizlik tədbirlərinə qədər, idarə etmək üçün çeviklik təmin edir.
Routing, serverin müxtəlif routelara və HTTP metodlarına (GET, POST, PUT, DELETE) gələn sorğuları effektiv şəkildə idarə etməsinə imkan verən əsas aspektdir. Server hər bir sorğunu düzgün şəkildə emal etməli və ya lazım olduqda uyğun xəta mesajları qaytarmalıdır. Express-də routing iki səviyyədə idarə oluna bilər:
-
Tətbiq səviyyəli routing: Bu, tətbiq daxilində birbaşa hər bir route-u və HTTP metodunu idarə etməkdir. Bu yanaşma az sayda endpointlər üçün sadədir, lakin routeların sayı artdıqca daha çətin olur. Məsələn:
app.get('/user/about/:id', (req, res) => { /* GET sorğusunu idarə et */ }); app.post('/user/about/:id', (req, res) => { /* POST sorğusunu idarə et */ }); app.get('/item/about/:id', (req, res) => { /* GET sorğusunu idarə et */ }); app.post('/item/about/:id', (req, res) => { /* POST sorğusunu idarə et */ });
-
Router səviyyəli routing: Bu metod
express.Router()
sinifindən istifadə edərək modulyar route idarəediciləri yaratmaqdır. Bu, xüsusən çoxsaylı routelara malik tətbiqlər üçün daha idarəediləbilən və təşkilatlanmışdır. Məsələn:const itemRouter = express.Router(); const userRouter = express.Router(); itemRouter.get('/about', (req, res) => { /* item haqqında */ }); itemRouter.get('/detail', (req, res) => { /* item detal */ }); userRouter.get('/about', (req, res) => { /* user haqqında */ }); userRouter.get('/detail', (req, res) => { /* user detal */ }); app.use('/item', itemRouter); app.use('/user', userRouter);
Express-də middleware funksiyaları, tətbiqin sorğu-cavab dövründə sorğu (req
), cavab (res
) və növbəti funksiyaya (next
) giriş əldə edən funksiyalardır. Middleware, sorğu və cavab obyektlərini dəyişdirə, sorğu-cavab dövrünü sonlandıra və növbəti middleware funksiyasını çağıra bilər.
Middleware Növləri:
-
Tətbiq səviyyəli Middleware: Bu middleware
app.use()
ilə tətbiq instansiyasına bağlanır. Autentifikasiya, loglama və sessiya idarəçiliyi kimi tapşırıqlar üçün istifadə edilə bilər. Məsələn:app.use((req, res, next) => { if (req.headers['password'] === 'pwd123') { console.log('Giriş icazə verildi:', new Date()); next(); } else { res.status(403).send('Qadağan edildi'); } });
-
Router səviyyəli Middleware: Bu middleware xüsusi bir router instansiyası üçün tətbiq edilir. Beləliklə, yalnız müəyyən routelar üçün middleware tətbiq edə bilərsiniz. Məsələn:
userRouter.use((req, res, next) => { console.log('User route girişi'); next(); });
-
Xəta İdarəetmə Middleware: Bu middleware tətbiqdəki səhvləri idarə edir. Bu, dörd arqument tələb edir: xəta, sorğu, cavab və növbəti.
next
istifadə edilməsə belə, metod imzasında daxil edilməlidir. Məsələn:app.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('Nəsə səhv oldu!'); });
-
Daxili Middleware: Express, statik faylları xidmət etmək üçün
express.static
, JSON yüklərini parse etmək üçünexpress.json
və daha çox şey kimi daxili middleware funksiyalarına malikdir. -
Üçüncü Tərəf Middleware: Bunlar icma tərəfindən təqdim edilən middleware funksiyalarıdır və npm vasitəsilə quraşdırıla bilər. Məsələn, sorğu bodylərini parse etmək üçün
body-parser
.
Şablonların render edilməsi, serverə məlumatlara əsaslanan HTML məzmununu dinamik şəkildə yaratmağa imkan verir. Express müxtəlif şablon mühərriklərindən istifadə edərək görünüşləri render edə bilər. Bu misalda, express-react-views
paketi serverdə React komponentlərini render etmək üçün istifadə olunur:
app.set('views', path.join(__dirname, 'myviews'));
app.set('view engine', 'jsx');
app.engine('jsx', require('express-react-views').createEngine());
app.get('/', (req, res) => {
res.render('index', { name: 'User' });
});
Burada, views
qovluğunda JSX faylları var ki, bu fayllar HTML strukturunu müəyyən edir və server göstərilən məlumatlara əsaslanaraq tam HTML səhifələrinə render edir.
Nəticə olaraq, routing, middleware və şablonlar Express tətbiqinin əsas komponentləridir, sorğuları idarə etməyə, məlumatları emal etməyə, cavabları idarə etməyə və dinamik məzmunu səmərəli şəkildə göstərməyə imkan verir.
Autentifikasiya və avtorizasiya veb tətbiqlərinin təhlükəsizliyində vacib rol oynayır. Autentifikasiya istifadəçinin şəxsiyyətini təsdiqləyir, avtorizasiya isə onların giriş səviyyələrini müəyyən edir. Aşağıda, Node.js-də geniş istifadə olunan üç autentifikasiya üsulu haqqında danışırıq: sessiyaya əsaslanan, tokenə əsaslanan və parolsuz autentifikasiya.
Sessiyaya əsaslanan autentifikasiya serverin istifadəçi sessiyalarını idarə etməsini nəzərdə tutur. Proses aşağıdakı kimidir:
- Giriş: İstifadəçi öz giriş məlumatlarını təqdim edir.
- Təsdiq: Server bu məlumatları verilənlər bazası ilə müqayisə edərək yoxlayır.
- Sessiyanın Yaradılması: Uğurlu təsdiqdən sonra, server bir sessiya yaradır və unikal sessiya identifikatoru (ID) təyin edir; bu identifikator verilənlər bazasında saxlanılır.
- Sessiya ID-nin Saxlanması: Sessiya ID istifadəçinin brauzerində cookie olaraq saxlanılır.
- Sessiyanın İdarə Edilməsi: Sessiya ID növbəti sorğuları təsdiqləmək üçün istifadə olunur və istifadəçi çıxış etdikdə və ya sessiya müddəti bitdikdə silinir.
Tokenə əsaslanan autentifikasiya JSON Web Token (JWT) kimi tokenlərdən istifadə edərək istifadəçi sessiyalarını idarə edir. Bu üsul iki əsas mərhələdən ibarətdir:
-
Autentifikasiya:
- İstifadəçi giriş məlumatlarını təqdim edir, server onları təsdiqləyir.
- Uğurlu təsdiqdən sonra, server istifadəçi məlumatları və iddialarını ehtiva edən bir ID token (JWT) yaradır.
- Müştəri bu tokeni adətən local storage və ya cookie-lərdə saxlayır.
-
Avtorizasiya:
- Müştəri tokeni növbəti sorğularda avtorizasiya başlığında göndərir.
- Server tokeni təsdiqləyir və tokenin iddialarına əsasən giriş hüququ verir.
Tokenlər aşağıdakılardan ibarətdir:
- Başlıq (Header): Tokenin növünü və hash algoritmini göstərir.
- Yük (Payload): İstifadəçi iddialarını ehtiva edir (məsələn, icazələr, rollar).
- İmza (Signature): Tokenin bütövlüyünü təmin edir.
Parolsuz autentifikasiya parollardan fərqli faktorlarla şəxsiyyəti təsdiq edir. Ümumi metodlar aşağıdakılardır:
- Biometrik məlumatlar: Barmaq izləri, üz tanıma və s.
- Sehrli Linklər: İstifadəçinin e-poçtuna göndərilən birdəfəlik istifadə olunan bağlantılar.
- Birdəfəlik Şifrələr (OTP): Mobil cihazlara göndərilən kodlar.
-
Açıq/Şəxsi Açar Cütləri: İstifadəçinin cihazı qeydiyyat zamanı bir açar cütü yaradır.
- Açıq Açar: Tətbiq ilə saxlanılır.
- Şəxsi Açar: İstifadəçinin cihazında təhlükəsiz şəkildə saxlanılır.
-
Autentifikasiya Prosesi:
- Server açıq açarla şifrələnmiş bir giriş çağırışı göndərir.
- İstifadəçinin cihazı şəxsi açarla bu çağırışı deşifrə edir və istənilən əməliyyatı yerinə yetirir (məsələn, biometrik məlumatları təsdiqləmək).
- Cavab serverə geri göndərilir.
- Autentifikasiya istifadəçinin şəxsiyyətini təsdiqləyir.
- Sessiyaya Əsaslanan Autentifikasiya server tərəfindən idarə olunan sessiyalar və cookie-lərdən istifadə edərək istifadəçi vəziyyətini idarə edir.
- Tokenə Əsaslanan Autentifikasiya JWT-lərdən istifadə edərək istifadəçi məlumatlarını asanlıqla saxlayır.
- Parolsuz Autentifikasiya açıq/şəxsi açar cütləri və alternativ faktorlardan istifadə edərək təhlükəsizliyi və istifadəçi rahatlığını təmin edir.
Autentifikasiya istifadəçinin şəxsiyyətini təsdiqləmək prosesidir. Bu, istifadəçinin kim olduğunu müəyyən edir və onların şəxsiyyətinə əsasən hansı resurslara daxil ola biləcəklərini göstərir. Node.js-də əsasən üç əsas autentifikasiya yanaşması istifadə olunur: sessiyaya əsaslanan, tokenə əsaslanan və parolsuz autentifikasiya. Bu yanaşmalar arasında tokenə əsaslanan autentifikasiya genişlənəbilənlik, elastiklik və təhlükəsizlik xüsusiyyətlərinə görə ən populyardır.
Tokenə əsaslanan autentifikasiya prosesi belədir:
-
İstifadəçi Girişi:
- İstifadəçi öz istifadəçi adı və şifrəsini serverə göndərir.
- Server bu məlumatları, adətən, verilənlər bazasına qarşı yoxlayır.
-
Tokenin Yaradılması:
- Uğurlu təsdiqdən sonra, server istifadəçi məlumatlarını və iddialarını ehtiva edən token, adətən JSON Web Token (JWT), yaradır.
- Token müştəriyə göndərilir və müştəri tərəfindən local storage və ya cookie-də saxlanıla bilər.
-
Tokenin İstifadəsi:
- Sonrakı sorğular üçün müştəri tokeni avtorizasiya başlığında göndərir.
- Server tokeni yoxlayır və istifadəçini autentifikasiyadan keçirir, resurslara daxil olma hüququ verir.
- Genişlənəbilənlik (Scalability): Tokenlər müştəri tərəfdə saxlanılır, bu da server yüklənməsini azaldır və tətbiqlərin genişləndirilməsini asanlaşdırır.
- Elastiklik: Tokenlər müxtəlif serverlər və tətbiqlər arasında istifadə edilə bilər, vahid autentifikasiya prosesini təmin edir.
- Təhlükəsizlik: JWT-lər imzalanıb şifrələnə bilər, bu da manipulyasiyanın qarşısını alır və xüsusi şifrələmə açarı olmadan icazəsiz oxunmanın qarşısını alır.
Tokenə əsaslanan autentifikasiya nümunəsini göstərmək üçün istifadəçi autentifikasiyasına əsasən işçi məlumatlarına çıxış təmin edən Express.js API serveri yaradacağıq. Tətbiq iki əsas API-yə malik olacaq:
- POST API: Giriş etmək və token almaq üçün istifadə olunur.
- GET API: Yalnız autentifikasiyadan keçmiş istifadəçilərə giriş icazəsi verilən işçi məlumatlarına çıxış üçün istifadə olunur.
Serverin Qurulması:
const express = require('express');
const jwt = require('jsonwebtoken');
const bodyParser = require('body-parser');
const app = express();
const JWT_SECRET = 'your_jwt_secret_key'; // Təhlükəsiz açarla əvəz edin
app.use(bodyParser.json());
Giriş Endpointi (signin
):
app.post('/signin', (req, res) => {
const { username, password } = req.body;
// Real tətbiqdə, istifadəçi verilənlər bazasından götürüləcək
if (username === 'user' && password === 'password') {
const token = jwt.sign({ username }, JWT_SECRET);
res.json({ token });
} else {
res.status(401).json({ message: 'Yanlış istifadəçi adı və/və ya şifrə' });
}
});
Qorunan Endpoint (/employees
):
app.get('/employees', (req, res) => {
const token = req.headers['authorization'];
if (!token) {
return res.status(401).json({ message: 'Token yoxdur' });
}
try {
const decoded = jwt.verify(token.split(' ')[1], JWT_SECRET);
// İstifadəçi icazələrini yoxlayın və müvafiq cavab verin
res.json({ message: 'İşçi Endpointinə giriş müvəffəqiyyətli oldu' });
} catch (error) {
res.status(401).json({ message: 'Bu resursa giriş üçün daxil olun' });
}
});
Server Dinləyicisi:
app.listen(5000, () => {
console.log('API Server http://localhost:5000 ünvanında işləyir');
});
-
Tokenə Əsaslanan Autentifikasiyanın Üstünlükləri:
- Genişlənəbilənlik: Tokenlər müştəri tərəfdə idarə olunur, bu da server yüklənməsini azaldır.
- Elastiklik: Tokenlər müxtəlif serverlər və tətbiqlər arasında istifadə edilə bilər.
- Təhlükəsizlik: JWT-lər imzalanıb şifrələnə bilər, təhlükəsiz ünsiyyəti təmin edir.
-
API Endpointləri:
- POST API (
/signin
): İstifadəçi autentifikasiyası və tokenin yaradılması üçün istifadə olunur. - GET API (
/employees
): Tokenlə təsdiqlənmiş istifadəçilər üçün qorunan resurslara çıxış imkanı verir.
- POST API (
İnternet müştəri-server arxitekturasında fəaliyyət göstərir. Müştərilər, son istifadəçilər tərəfindən istifadə olunan interfeyslərdir, serverlər isə biznes məntiqi, məlumat və funksionallığı təmin edən xidmətləri yerləşdirir. Müştərilər və serverlər arasında ünsiyyət Hypertext Transfer Protocol (HTTP) vasitəsilə baş verir və bu mübadilə çox vaxt Application Programming Interfaces (APIs) vasitəsilə həyata keçirilir. 2000-ci ildə bu API-lərin yaradılması üçün REST (Representational State Transfer) adlanan bir sıra qaydalar müəyyən edilmişdir.
- Xidmət: Tətbiq daxilində müəyyən məqsədi yerinə yetirən proqram komponenti, adətən giriş qəbul edir və çıxış təmin edir.
- HTTP: Müştərilər və serverlər arasında məlumat mübadiləsi üçün istifadə edilən protokol.
- API: Proqram komponentləri arasında ünsiyyət üçün təriflər və protokollar toplusu.
- REST: Resursları standart şəkildə müəyyən etmək və idarə etmək üçün API-lərin yaradılması üçün arxitektura qaydaları.
- Resurs: RESTful API-də əsas anlayış, verilənlər və metodlarla əlaqəli obyektləri təmsil edir.
REST API-lərində istifadə olunan ümumi HTTP metodları:
- GET: Resursun təmsilini əldə edir. Resursu dəyişdirməməlidir.
- POST: Serverə məlumat göndərərək yeni resurs yaradır. Adətən
201 CREATED
status kodu qaytarır. - PUT: Mövcud resursu yeniləyir və ya dəyişdirir. PUT bir neçə dəfə çağırılsa belə nəticə dəyişməz (idempotentdir).
- DELETE: Resursu silir. Uğurlu olarsa,
204 NO CONTENT
qaytarmalıdır. - PATCH: Resursa qismən dəyişikliklər tətbiq edir.
- Sorğu Obyekti: URL, sorğu başlığı və sorğu body-sini ehtiva edir. URL protokol, host adı, path və sorğu sətirindən ibarətdir.
- Cavab Obyekti: Cavab başlığı, body və status kodunu ehtiva edir, çox vaxt məlumatları JSON formatında təqdim edir.
- 200-299: Uğur (məs.,
200 OK
,201 CREATED
) - 300-399: Yönləndirmə (məs.,
301 MOVED PERMANENTLY
) - 400-499: Müştəri tərəfi səhvi (məs.,
400 BAD REQUEST
,404 NOT FOUND
) - 500-599: Server tərəfi səhvi (məs.,
500 INTERNAL SERVER ERROR
)
- Resurs-Əsaslı: API-lər resurslar ətrafında təşkil edilməlidir, hərəkətlər ətrafında deyil.
- Stateless: Müştəri tərəfindən serverə göndərilən hər bir sorğu tələbini başa düşmək və işləmək üçün lazım olan bütün məlumatları ehtiva etməlidir.
- Keşləndirilə bilən: Cavablar özlərini keşləndirilə bilən və ya olmamaq kimi müəyyən etməlidir ki, performans yaxşılaşdırılsın.
- Birləşik İnterfeys (Uniform Interface): İnterfeys uyğun olmalı, müştəri-server qarşılıqlı əlaqələrini məlumat təqdimatından ayırmalıdır.
- Layihəli Sistem (Layered System): API-lər orta laylar (məsələn, middleware) vasitəsilə işləyəcək şəkildə dizayn edilə bilər, müştəri və ya server bu aralıq laylar haqqında məlumatlı olmadan.
- Hierarxik əlaqələri göstərmək üçün slashes (
/
) istifadə edin. - Son slashes-lərdən çəkinin.
- Oxunabilirlik üçün tire (
-
) istifadə edin, alt xəttlərdən (_
) çəkinin. - Kiçik hərflərdən istifadə edin.
- URL-lərdə nöqtələrdən (
.
) çəkinin. - Lazım olduqda tabe resurslar və ID-ləri URL-də daxil edin.
- RESTful Olmayan:
GET http://api.myapp.com/getUser/123
- RESTful:
GET http://api.myapp.com/users/123
- URL Path Parametri: URL pathində dəyişən.
- URL Sorğu Parametri:
?
işarəsindən sonra gələn və&
ilə ayrılan açar-dəyər cütləri. - Başlıq Parametri: Sorğu və ya cavab haqqında metadata.
Express xüsusi bir qovluq strukturu tələb etməsə də, layihənizin böyüdükcə idarə oluna bilənliyi üçün onu təşkil etmək vacibdir. Aşağıdakı qovluqlar geniş yayılmışdır:
- node_modules: Proqramın modulları və paketlərini ehtiva edir,
npm install
əmri ilə avtomatik olaraq yaradılır. - config: Verilənlər bazası bağlantıları, mühit dəyişənləri və API açarları kimi konfiqurasiya fayllarını saxlayır.
- models: Proqram üçün verilənlər modellərini ehtiva edir, tez-tez Object-Relational Mapping (ORM) kitabxanası ilə müəyyən edilir.
- routes: Fərqli obyektlər üçün bütün routeları təyin edir, adətən hər məntiqi route dəsti üçün bir fayl.
- views: Dinamik olaraq HTML, CSS və JavaScript yaratmaq üçün şablon fayllarını saxlayır.
- public: Şəkillər, CSS və JavaScript kimi statik məzmunu ehtiva edir, adətən hər məzmun növü üçün alt qovluqlara təşkil olunur.
Əsas fayllar aşağıdakılardır:
- app.js: Proqramın əsas konfiqurasiya faylı.
- routes.js: Route təyinatlarını mərkəzləşdirir və routes qovluğundan faylları tələb edir/idxal edir və onları
app.js
üçün bir modul olaraq ixrac edir. - package.json: Layihə metadataları və asılılıqları idarə edir.
-
Resurs-Əsaslı Routelar: Routelarda resurs identifikatorları olaraq isimlərdən istifadə edin. Məsələn:
POST /employees
işçi yaratmaq üçün.GET /employees/:id
işçini əldə etmək üçün.PATCH /employees/:id
işçini yeniləmək üçün.DELETE /employees/:id
işçini silmək üçün.
-
HTTP Status Kodları: Uyğun status kodlarından istifadə edin:
- 2xx: Uğur (məs.,
200 OK
,201 CREATED
) - 3xx: Yönləndirmə (məs.,
301 MOVED PERMANENTLY
) - 4xx: Müştəri tərəfi səhvi (məs.,
400 BAD REQUEST
,404 NOT FOUND
) - 5xx: Server tərəfi səhvi (məs.,
500 INTERNAL SERVER ERROR
)
- 2xx: Uğur (məs.,
-
Testləşdirmə: REST API-lər üçün black-box testi istifadə edin. Mocha və SuperTest kimi vasitələr HTTP sorğularını kodun daxili strukturasına baxmadan test edə bilər.
-
Təsdiqləmə: JSON Web Tokens (JWT) istifadə edərək, müştəri tərəfində saxlanılan sessiya məlumatları ilə vəziyyətsiz təsdiqləmə təmin edin.
-
Sənədləşdirmə: Düzgün API sənədləşdirilməsi vacibdir. API Blueprint və Swagger kimi vasitələr dəqiq və əlçatan sənədlər yaratmağa kömək edə bilər.
-
NPM:
- Node.js layihəsini başlatmaq üçün
npm init
və yanpm init -y
istifadə edin. - Asılılıqları idarə etmək üçün
npm install --save
və yanpm install --save-dev
istifadə edin. - Heç vaxt
node_modules
qovluğunu repozitoriyaya göndərməyin ; əvəzinə asılılıqları quraşdırmaq üçünnpm install
istifadə edin.
- Node.js layihəsini başlatmaq üçün
-
Böyük-kiçik hərf Konvensiyaları:
- Fayl adları üçün kiçik hərflərdən istifadə edin.
- Dəyişən adları üçün camelCase istifadə edin.
- Npm modullarını kiçik hərflərdə, tirelərlə ayrılmış şəkildə adlandırın (məs.,
express-session
). - Npm modullarını tələb edərkən camelCase istifadə edin.
-
Konfiqurasiya və Routelar:
- Dəyişənləri konfiqurasiya fayllarında saxlayın.
- Oxşar routeları daha yaxşı təşkilatçılıq və idarə oluna bilənlik üçün ayrı fayllara qruplaşdırın.
-
Anonymous Function:
Anonim Funksiya - Adı olmayan və tez-tez digər funksiyalara arqument kimi istifadə olunan funksiya. -
Application Server:
Tətbiq Serveri - Məlumatları emal edən və iş məntiqini yerinə yetirən, dinamik məzmun yaradan server. -
Asynchronous:
Asinxron - Digər proseslərdən müstəqil şəkildə işləyən proses. -
Callback Function:
Geri Çağırma Funksiyası - Digər funksiyaya parametr kimi ötürülən və hərəkəti tamamlamaq üçün çağırılan funksiya, adətən asinxron əməliyyatlarda istifadə olunur. -
Database Server:
Verilənlər Bazası Serveri - Verilənlər bazasını saxlamaq və xidmətlər göstərmək üçün həsr edilmiş server. -
Dependencies:
Asılılıqlar - Proqramda istifadə olunan xarici kitabxanalar və paketlər. -
Event-Driven:
Hadisə-İdarəetmə - Proqramın axınının istifadəçi girişləri kimi hadisələrlə təyin olunduğu proqramlaşdırma paradigması. -
Express.js:
Express.js - Node.js üzərində tətbiqlər yaratmaq üçün çevik veb framework. -
Framework:
Framework - Tətbiqləri yaratmaq üçün ümumi funksionallıq və struktur təmin edən əvvəlcədən yazılmış kodlar dəsti. -
HTTP Server:
HTTP Server - HTTP sorğularını və cavablarını idarə edən proqram. -
Load:
Yüklənmə - Eyni vaxtda istifadəçilər, tranzaksiyalar və müştərilər ilə serverlər arasında məlumat transferini ifadə edir. -
Module:
Modul - Müəyyən bir məqsədə xidmət edən əlaqəli JavaScript kodu ehtiva edən fayl. -
Multi-Threaded:
Çoxişli - Bir neçə tapşırığın eyni vaxtda icra edilməsi imkanı. -
Node.js:
Node.js - Google Chrome-un V8 mühərriki üzərində qurulmuş JavaScript runtime. -
Non-Blocking:
Bloklamayan - Bir əməliyyatın uğursuz olması digərlərini təsir etməyən və tapşırıqların bir-birini bloklamadığı bir sistem. -
Npm:
npm - Node.js paketlərini idarə etmək üçün bir vasitə. -
Package:
Paket - Bir və ya bir neçə modul ehtiva edən qovluq. -
Package.json:
Package.json - Layihə haqqında məlumatları, o cümlədən onun asılılıqlarını və skriptlərini ehtiva edən fayl. -
Payload:
Yük - Müştəri ilə server arasında ötürülən məlumatlar. -
Runtime Environment:
Çalışma Mühiti - Tətbiqin işə düşməsi üçün zəruri resursları təmin edən infrastruktur. -
Scalability:
Ölçəklilik - Performansı təsir etmədən artan və ya azalan yükləri idarə etmək qabiliyyəti. -
Server.js:
Server.js - Server qurmaq üçün istifadə olunan kodları ehtiva edən fayl. -
Single-Threaded:
Tək-İşli - Eyni anda yalnız bir əmri işləyən sistem. -
Web Server:
Veb Server - Müştəri sorğularına cavab verən, adətən HTTP istifadə edən server. -
Web Service:
Veb Xidməti - Veb serverlər və müştərilər arasında HTTP sorğuları vasitəsilə ünsiyyət quran API.
-
Async:
Asinxron - "Asynchronous" sözünün qısaldılması, eyni anda bir neçə əməliyyatı müstəqil şəkildə icra etməyə imkan verən proqramlaşdırma üsulu. -
Axios Package:
Axios Paket - HTTP sorğuları ətrafında vədələrlə işləyən kitabxana, vədə obyektini qaytarır. -
Callback Hell:
Geri Çağırma Cəhənnəmi - Bir neçə iç-içə geri çağırma funksiyaları ilə kodun oxunması və saxlanması çətinləşən vəziyyət. -
Inversion of Control:
İdarəetmənin Tərsinə Çevrilməsi - İcra axınının proqramçı deyil, bir framework və ya kitabxana tərəfindən idarə olunduğu proqramlaşdırma prinsipi. -
Promise:
Vəd - Asinxron əməliyyatın gələcəkdə tamamlanmasını və ya uğursuz olmasını təmsil edən obyekt; vəziyyətlər: gözləmə, yerinə yetirilmiş və ya rədd edilmiş. -
Pyramid of Doom:
Doom Piramidası - "Geri Çağırma Cəhənnəmi"nin digər adı; çox sayda iç-içə funksiyaların yaratdığı kod strukturu.
-
Access Token:
Giriş Tokeni - İstifadəçi məlumatlarını, icazələrini və müddətini ehtiva edən token, resurslara giriş üçün istifadə olunur. -
API Endpoint:
API Son Nöqtəsi - API-nin bir tətbiqlə əlaqə qurduğu nöqtə. -
Application-Level Middleware:
Tətbiq Səviyyəsində Middleware - Bütün tətbiqə aid olan, sorğuları idarə edən və emal edən middleware. -
Authentication:
Kimlik Doğrulama - İstifadəçinin kimliyini təsdiqləmə prosesi. -
Authorization:
İcazə Verilməsi - İstifadəçinin bir resursa giriş hüququ olub-olmadığını müəyyənləşdirmək prosesi. -
Built-In Middleware:
Daxili Middleware - Express tərəfindən JSON emalı və görünüşlərin renderlənməsi kimi vəzifələri yerinə yetirən middleware. -
Controller:
İdarəçi - MVC arxitekturasında, istifadəçi daxilolmalarını emal edən, modellərlə əlaqə quran və görünüşləri qaytaran komponent. -
Error-Handling Middleware:
Xəta İdarəetmə Middleware - Tətbiqdaxili xətaları idarə etmək üçün xüsusi olaraq hazırlanmış middleware. -
Express.js:
Express.js - Node.js üçün veb tətbiq frameworkü, aşağı səviyyəli detalları abstraktlaşdırır. -
Framework:
Framework - Tətbiqin qurulması üçün struktur və öncədən təyin olunmuş komponentlər təqdim edən quruluş. -
HTTP Headers:
HTTP Başlıqları - HTTP sorğusu və ya cavabı ilə göndərilən metadata. -
HTTP Request:
HTTP Sorğusu - Müştəri tərəfindən serverə resurs tələb edən mesaj. -
HTTP Response:
HTTP Cavabı - Server tərəfindən müştəriyə HTTP sorğusuna cavab olaraq göndərilən mesaj. -
ID Token:
ID Tokeni - İstifadəçinin autentifikasiya olunduğunu sübut edən token. -
JSON Payload:
JSON Yükü - HTTP sorğusu və ya cavabının bodysində göndərilən JSON formatında məlumat. -
JWT (JSON Web Token):
JWT (JSON Web Token) - Tərəflər arasında məlumatın təhlükəsiz ötürülməsi üçün istifadə olunan token formatı. -
Middleware:
Middleware - Sorğu və cavab obyektlərinə giriş imkanı olan və onları dəyişdirə bilən və ya sorğu-cavab dövrünü sona çatdıra bilən funksiyalar. -
Model:
Model - MVC arxitekturasında, məlumat və iş məntiqini idarə edən komponent. -
MVC (Model-View-Controller):
MVC (Model-Görünüş-İdarəçi) - Tətbiqi model, görünüş və idarəçi komponentlərinə bölən arxitektura nümunəsi. -
Node Framework:
Node Framework - Node.js üzərində qurulmuş, struktur və ümumi funksionallıq təmin edən framework. -
npm:
npm - Node.js paketlərini idarə etmək üçün paket meneceri. -
Passwordless Authentication:
Şifrəsiz Kimlik Doğrulama - Şifrələr yerinə açar/cüt açar istifadə edən autentifikasiya metodu. -
Private Key:
Şəxsi Açar - Yalnız müəyyən bir istifadəçi tərəfindən bilinən, deşifrə üçün istifadə olunan kriptovalyuta açarı. -
Public Key:
İctimai Açar - Hər kəsin müəyyən bir istifadəçi üçün məlumatı şifrələmək üçün istifadə edə biləcəyi kriptovalyuta açarı. -
REST (Representational State Transfer):
REST - Stateless API-lər dizayn etmək üçün prinsiplər toplusu. -
REST API:
REST API - REST prinsiplərinə uyğun olan API. -
Route:
Yol - Tətbiqin müəyyən bir HTTP sorğu metodu və URL-ə necə cavab verdiyini müəyyən edən. -
Router-Level Middleware:
Router-Səviyyəsində Middleware - Tam tətbiqə deyil, xüsusi bir routerə aid olan middleware. -
Session-based Authentication:
Sessiya-Əsaslı Kimlik Doğrulama - Sessiya ID-ləri istifadə edərək, cookies-də saxlanılan autentifikasiya metodu. -
Statelessness:
Statelessness - Hər HTTP sorğusunun müstəqil olduğu, serverdə müştəri vəziyyətinin saxlanılmadığı vəziyyət. -
Template Rendering:
Şablon Renderlənməsi - Məlumatları şablonlarla birləşdirərək dinamik məzmun yaratma. -
Token:
Token - Kimlik doğrulama və icazə üçün istifadə olunan məlumat parçası, başlıq, yük və imza ehtiva edir. -
Token-based Authentication:
Token-Əsaslı Kimlik Doğrulama - Resurslara giriş hüququ vermək üçün JWT kimi tokenlər istifadə edən autentifikasiya metodu. -
TypeScript:
TypeScript - JavaScript-in tip təhlükəsizliyi və digər xüsusiyyətlər əlavə edən üstsetidir, geniş miqyaslı tətbiqlər üçün faydalıdır. -
View:
Görünüş - MVC arxitekturasında, istifadəçiyə məlumatı təqdim edən komponent. -
xml2js:
xml2js - XML mətnlərini JavaScript obyektlərinə çevirmək üçün Node.js paketi.
-
http/createServer
Təsvir:http
paketi, serverə uzaqdan əlaqə qurmaq və ya müştəri sorğularını dinləyən bir server yaratmaq üçün istifadə olunur.createServer
birrequestListener
qəbul edir, bu funksiyarequest
vəresponse
parametrləri ilə işləyir.
Kod Nümunəsi:const http = require('http'); const requestListener = function(req, res) { res.writeHead(200); res.end('Hello, World!'); } const port = 8080; const server = http.createServer(requestListener); console.log('server listening on port: '+ port); server.listen(port);
-
new Date()
Təsvir: Cari tarixi obyekt kimi qaytarır. Tarix obyektinə formatlamaq və ya zaman zonası dəyişdirmək üçün metodlar çağırıla bilər.
Kod Nümunəsi:module.exports.getDate = function getDate() { let aestTime = new Date().toLocaleString("en-US", {timeZone: "Australia/Brisbane"}); return aestTime; }
-
import()
Təsvir: Digər modul tərəfindən ixrac edilən modulları idxal etmək üçün istifadə olunur. Yenidən istifadə olunan kodu ehtiva edən fayl modul adlanır.
Kod Nümunəsi:// addTwoNos.mjs function addTwo(num) { return num + 4; } export { addTwo }; // app.js import { addTwo } from './addTwoNos.mjs'; // Prints: 8 console.log(addTwo(4));
-
require()
Təsvir: Node.js-in daxili metodu olanrequire()
, müxtəlif fayllardan xarici modulları daxil edir. JavaScript faylını oxuyur və icra edir, sonra ixrac obyektini qaytarır.
Kod Nümunəsi:module.exports = 'Hello Programmers'; let msg = require('./messages.js'); console.log(msg);
-
Async-await
Təsvir: Promisləri yalnız asinxron funksiyalarda çağırarkən gözləyin.
Kod Nümunəsi:const axios = require('axios').default; let url = "some remote url"; async function asyncCall() { console.log('calling'); const result = await axios.get(url); console.log(result.data); } asyncCall();
-
Callback
Təsvir: Parametr olaraq ötürülən metodlar, bu metodların daxilində çağırılır. Promislerle cavabları və ya xətaları emal etmək üçün istifadə olunur.
Kod Nümunəsi:// function(res) və function(err) anonim geri çağırma funksiyalarıdır axios.get(url).then(function(res) { console.log(res); }).catch(function(err) { console.log(err); });
-
Promise
Təsvir: Asinxron əməliyyatın gələcəkdə tamamlanmasını və ya uğursuz olmasını təmsil edən obyekt. Kod bloklanmadan işləyir, vəd yerinə yetirilənə qədər və ya istisna atılana qədər.
Kod Nümunəsi:axios.get(url).then( // nəsə et ).catch( // nəsə et );
-
Promise use case
Təsvir: Vədlər zaman alan funksiyalar üçün, məsələn, uzaq URL-ə çıxış və ya I/O əməliyyatları üçün istifadə olunur.
Kod Nümunəsi:let prompt = require('prompt-sync')(); let fs = require('fs'); const methCall = new Promise((resolve, reject) => { let filename = prompt('What is the name of the file?'); try { const data = fs.readFileSync(filename, {encoding: 'utf8', flag: 'r'}); resolve(data); } catch (err) { reject(err); } }); console.log(methCall); methCall.then( (data) => console.log(data), (err) => console.log("Error reading file") );
-
object.on()
Təsvir: Bir hadisə baş verəndə framework tərəfindən çağırılan hadisə emalçısını müəyyən edir.
Kod Nümunəsi:http.request(options, function(response) { let buffer = ''; response.on('data', function(chunk) { buffer += chunk; }); response.on('end', function() { console.log(buffer); }); }).end();
-
Callback Hell/The Pyramid of Doom
Təsvir: Bir-birinin altına yığılmış iç-içə geri çağırma funksiyaları, kodun oxunmasını və saxlanmasını çətinləşdirir.
Kod Nümunəsi:const makeCake = nextStep => { buyIngredients(function(shoppingList) { combineIngredients(bowl, mixer, function(ingredients) { bakeCake(oven, pan, function(batter) { decorate(icing, function(cake) { nextStep(cake); }); }); }); }); };
-
Axios Request
Təsvir:axios
paketi HTTP sorğularını idarə edir və vəd obyektini qaytarır.
Kod Nümunəsi:const axios = require('axios').default; const connectToURL = (url) => { const req = axios.get(url); console.log(req); req.then(resp => { console.log("Fulfilled"); console.log(resp.data); }) .catch(err => { console.log("Rejected"); }); } connectToURL('valid-url'); connectToURL('invalid-url');
-
Dependencies in package.json
Təsvir: Express versiyası 4.0-dan 5.0-a qədər olan asılılıq aşağıdakı kimi bəyan edilir:
Kod Nümunəsi:"dependencies": {"express": "4.x"}
-
new express()
Təsvir: Express obyekti yaradır, bu obyekt server tətbiqi kimi fəaliyyət göstərir.
Kod Nümunəsi:const express = require("express"); const app = new express();
-
express.listen()
Təsvir:listen
metodu Express obyektində serverin dinləyəcəyi port nömrəsi ilə çağırılır. Funksiya server dinləməyə başladıqda icra edilir.
Kod Nümunəsi:app.listen(3333, () => { console.log("Listening at http://localhost:3333"); });
-
express.get()
Təsvir: Serverə GET sorğularını idarə edir.get()
metodu iki parametr ilə həyata keçirilir; endpoint və sorğu və cavab emal edən funksiya.
Kod Nümunəsi:// /user/about/id endpointinə GET sorğuları idarə edir. app.get("/user/about/:id", (req, res) => { res.send("Response about user " + req.params.id); });
-
express.post()
Təsvir: Serverə POST sorğularını idarə edir.post()
metodu iki parametr ilə həyata keçirilir; endpoint və sorğu və cavab emal edən funksiya.
Kod Nümunəsi:// Eyni endpointə POST sorğularını idarə edir. app.post("/user/about/:id", (req, res) => { res.send("Response about user " + req.params.id); });
-
express.use()
Təsvir: Middleware-i parametr olaraq qəbul edir. Middleware,get()
vəpost()
emalçılara çatmadan əvvəl eyni qaydada işləyən qapıçı kimi fəaliyyət göstərir.
Kod Nümunəsi:const express = require("express"); const app = new express(); function myLogger(req, res, next) { req.timeReceived = Date(); next(); } app.use(myLogger); app.get("/", (req, res) => { res.send("Request received at " + req.timeReceived + " is a success!"); });
-
express.Router()
Təsvir: Router səviyyəli middleware,express.Router()
obyektinin bir nümunəsinə bağlanır. Müəyyən yol və xüsusi middleware üçün istifadə oluna bilər.
Kod Nümunəsi:const express = require("express"); const app = new express(); let userRouter = express.Router(); userRouter.use(function (req, res, next) { console.log("User query time:", Date()); next(); }); userRouter.get("/:id", function (req, res) { res.send("User " + req.params.id + " last successful login " + Date()); }); app.use("/user", userRouter); app.listen(3333, () => { console.log("Listening at http://localhost:3333"); });
-
express.static()
Təsvir: Server tərəfdən statik HTML səhifələri və şəkilləri xidmət etmək üçün istifadə olunan middleware.
Kod Nümunəsi:const express = require("express"); const app = new express(); app.use(express.static("cad220_staticfiles")); app.listen(3333, () => { console.log("Listening at http://localhost:3333"); });
-
jsonwebtoken.sign()
Təsvir: Yaradılmış JWT (JSON Web Token) əsasında giriş imzası üçün istifadə olunur.
Kod Nümunəsi:if (uname === "user" && pwd === "password") { return res.json({ token: jsonwebtoken.sign({ user: "user" }, JWT_SECRET), }); }
-
jsonwebtoken.verify()
Təsvir: JWT-ni token dəyəri və JWT sirri ilə təsdiqləyir.
Kod Nümunəsi:const verificationStatus = jsonwebtoken.verify(tokenValue, "aVeryVerySecretString");
-
Project folder structure
Təsvir: Express.js istifadə edərək API-lərin standart layihə strukturu.
Kod Nümunəsi:test-project/ node_modules/ config/ db.js // Verilənlər bazası əlaqəsi və konfiqurasiyası credentials.js // Tətbiqinizdə istifadə olunan şifrələr/API açarları models/ // Mongoose sxemləri üçün items.js prices.js routes/ // Müxtəlif entitilər üçün bütün yolların müxtəlif faylları items.js prices.js app.js routes.js // Bütün yolları bu faylda tələb edir və sonra bu faylı app.js-də tələb edir package.json