Node JS & Express əsasları (III). Node JS & Express Basics (III) Oxu qeydləri: READ marşrutu




  • Tərcümə

Yeni proqramçı üçün Node.js üçün inkişaf kabus kimi görünə bilər. Günahkar platformanın çevikliyi və aydın təlimatların olmamasıdır. Amma əslində hər şey o qədər də qorxulu deyil.


Məsələn, burada tipik bir tapşırıq var: proqramın server hissəsi olan REST API-nin hazırlanması. Node-un öz imkanlarının bolluğu və bu problemi həll etməyə kömək edə biləcək bir çox əlavə modullar yeni başlayanı seçim zənginliyinə görə çıxılmaz vəziyyətə sala bilər. Burada əsas məsələlər komponentlərin seçilməsi və onların birlikdə necə işləməsidir.

Server tərəfində proqram yaratmağın bir yolu Node.js, Express çərçivəsi və MongoDB DBMS-nin birləşməsindən istifadə etməkdir. Əslində, bu gün demək olar ki, hər hansı bir tətbiq üçün əsas ola biləcək işləyən API maketini necə yaratmaq barədə danışacağam. Burada biz əsas REST marşrutlarını həyata keçirəcəyik, API ilə HTTP üzərindən qarşılıqlı əlaqədə olacağıq və sadə verilənlər bazası seçimlərindən istifadə edəcəyik.

Bu materialı uğurla mənimsəmək üçün siz REST API-nin nə olduğunu başa düşməlisiniz, CRUD əməliyyatlarını başa düşməlisiniz və JavaScript-də əsas biliklərə sahib olmalısınız. Mən burada ES6 istifadə edirəm, çox mürəkkəb bir şey yoxdur, əsasən ox funksiyaları.

Google Keep-ə bənzər qeydlər aparan proqram üçün arxa uç skeleti hazırlayacağıq. Bu halda, bütün dörd CRUD əməliyyatını qeydlərlə, yəni yaratmaq, oxumaq, yeniləmək və silmək mümkün olacaq.

İlkin hazırlıq

Hələ Node yoxdursa, onu quraşdırmağın vaxtıdır. Quraşdırıldıqdan sonra bir qovluq yaradın və orada yeni layihəni işə salmaq üçün əmri işlədin:

Npm başladın
Başlanğıc zamanı suallara cavab verin, xüsusən də tətbiqə "diqqətli" ad verin (və ya istəsəniz, hər hansı başqa ad).

Fayl indi qovluqda görünməlidir paket.json. Bu o deməkdir ki, siz layihənin asılı olduğu əlavə paketləri quraşdırmağa başlaya bilərsiniz.

Biz Express-dən çərçivə kimi istifadə etməyi planlaşdırırıq. Verilənlər bazası idarəetmə sistemi MongoDB olacaq. Bundan əlavə, JSON ilə işləmək üçün köməkçi vasitə kimi biz body-parser paketindən istifadə edirik. Bütün bunları quraşdıraq:

Npm install --save express mongodb body-parser
Həmçinin, Nodemon-u inkişaf etdirici asılılıq olaraq quraşdırmağı tövsiyə edirəm. Bu, fayllar dəyişdikdə serveri avtomatik yenidən işə salan sadə kiçik paketdir.

Bu paketi quraşdırmaq üçün əmri işlədin:

Npm install --save-dev nodemon
Sonra aşağıdakı skripti fayla əlavə edə bilərsiniz paket.json:

// package.json "scripts": ("dev": "nodemon server.js" ),
Hazır paket.json bu kimi bir şey görünəcək:

// package.json ( "ad": "diqqətəlayiq", "versiya": "1.0.0", "təsvir": "", "əsas": "server.js", "skriptlər": ( "dev": "nodemon server.js", "author": "", "lisenziya": "ISC", "asılılıqlar": ( "body-parser": "^1.15.2", "express": "^4.14.0 " , "mongodb": "^2.2.16" ), "devDependencies": ( "nodemon": "^1.11.0" ) )
İndi bir fayl yaradaq server.js və API üzərində işə başlayaq.

Server

Fayldakı asılılıqları birləşdirərək başlayaq server.js.

// server.js const express = tələb ("express"); const MongoClient = tələb edir("mongodb").MongoClient; const bodyParser = tələb edir("bədən-parser"); const app = express();
Biz verilənlər bazası ilə qarşılıqlı əlaqə yaratmaq üçün MongoClient-dən istifadə edəcəyik. Bundan əlavə, biz burada Ekspres çərçivə nümunəsi ilə tətbiqimizi simvollaşdıran proqram sabitini işə salırıq. Serverin işləməsi üçün tətbiqə HTTP sorğularını dinləməyə başlamasını söyləmək qalır.

Burada portu təyin edirik və aşağıdakı kimi dinləməyə başlayırıq:

// server.js const port = 8000; app.listen(port, () =>
İndi npm run dev (və ya Nodemon quraşdırmamısınızsa server.js node) əmrini işlədirsinizsə, terminalda mesaj görünməlidir: “Biz 8000 portunda canlıyıq”.

Beləliklə, server işləyir. Amma indi o, tamamilə faydalı heç nə etmir. Gəlin bunu anlayaq.

CRUD əməliyyatlarını hədəfləyən marşrutlar

Biz 4 marşrut yaratmağı planlaşdırırıq. Məhz:
  • CREATE – qeydlər yaratmaq.
  • OXUYUN - qeydləri oxuyun.
  • YENİLƏNİB - qeydlərin yenilənməsi.
  • SİL — qeydləri silin.
Bu sxemi mənimsədikdən sonra, Node-dan istifadə edərək, demək olar ki, istənilən REST marşrutunu necə təşkil edəcəyinizi başa düşə biləcəksiniz.

API-ni sınamaq üçün sizə proqramın müştəri tərəfindən sorğuları simulyasiya edə biləcək bir şey lazımdır. Postman adlı əla proqram bizə bu problemi həll etməyə kömək edəcək. O, verilmiş gövdə və parametrlərlə sadə HTTP sorğularını yerinə yetirməyə imkan verir.

Postman quraşdırın. İndi hər şey marşrutları konfiqurasiya etməyə hazırdır.

Layihənin strukturu haqqında

Node.js dərsliklərinin əksəriyyəti (və bir çox real həyat proqramları) bütün marşrutları bir böyük faylda yerləşdirir marşrut.js. Bu yanaşmanı çox bəyənmirəm. Faylları müxtəlif qovluqlarda təşkil etsəniz, bu kodun oxunuşunu yaxşılaşdıracaq və tətbiqi idarə etməyi asanlaşdıracaq.

Tətbiqimizi böyük adlandırmaq olmaz, lakin mən onun təvazökar miqyasını nəzərə alaraq hər şeyi lazım olduğu kimi etməyi təklif edirəm. Aşağıdakı qovluqları yaradın: qovluq proqram, və onun içərisində - marşrutlar. Qovluqda marşrutlar fayllar yaradın index.jsnote_routes.js. Başqa sözlə, layihə strukturu belə görünəcək: kök > proqram > marşrutlar > index.jsnote_routes.js.

Mkdir tətbiqi cd proqramı mkdir marşrutları cd marşrutları toxunma index.js toxunma note_routes.js
Bu struktur kiçik bir tətbiq üçün lazımsız görünə bilər, lakin nümunəmiz əsasında qurulmuş daha böyük bir sistemdə çox faydalı olacaqdır. Bundan əlavə, ən yaxşı mövcud təcrübələrdən istifadə edərək hər hansı bir layihəyə başlamaq yaxşıdır.

Qeydlərin yaradılması: marşrut YARADIN

CREATE marşrutu ilə başlayaq. Bunu etmək üçün suala cavab verəcəyik: "Qeyd necə yaradılır?"
Qeydlər yaratmağa başlamazdan əvvəl tətbiqin infrastrukturunu genişləndirməliyik. Express-də marşrutlar arqument kimi Express nümunəsini və verilənlər bazasını götürən funksiyaya bükülür.

Bu belə görünə bilər:

// marşrutlar/note_routes.js module.exports = funksiya (app, db) ( );
İndi bu funksiyanı vasitəsilə ixrac edə bilərsiniz index.js:

// marşrutlar/index.js const noteRoutes = tələb edir("./note_routes"); module.exports = function(app, db) ( noteRoutes(app, db); // Burada daha sonra başqa marşrut idarəçiləri olacaq );
Aldığımızı idxal edirik server.js:

// server.js const express = tələb ("express"); const MongoClient = tələb edir("mongodb").MongoClient; const bodyParser = tələb edir("bədən-parser"); const app = express(); const port = 8000; tələb ("./app/routes")(tətbiq, ()); app.listen(port, () => ( console.log("Biz canlı yayımdayıq " + port); ));
Nəzərə alın ki, verilənlər bazasını hələ konfiqurasiya etmədiyimiz üçün ikinci arqument kimi boş obyekt ötürülür.

İndi biz CREATE marşrutunu yaradırıq. Burada sintaksis olduqca sadədir:

Module.exports = function(app, db) ( app.post("/notes", (req, res) => ( // Biz burada qeyd yaradacağıq. res.send("Salam") )); );
Tətbiq '/qeydlər' yolu ilə POST sorğusunu qəbul etdikdə, o, geri çağırış funksiyası daxilində kodu icra edəcək, ona sorğu obyektini (sorğu parametrlərini və ya JSON məlumatlarını ehtiva edir) və cavab obyektini (əlbəttə ki, cavab üçün istifadə olunur).

Bizim əldə etdiklərimiz artıq sınaqdan keçirilə bilər. Gəlin, Postmandan istifadə edərək ünvana POST sorğusu göndərək localhost:8000/qeydlər.


Sorğunun cavabı “Salam” olmalıdır

Əla. İlk marşrut yaradılıb. Növbəti addım sorğuya parametrlər əlavə etmək, onları API-də emal etmək və nəhayət qeydi verilənlər bazasında saxlamaqdır.

Parametrləri tələb edin

Poçtalyonda nişana keçin Bədən və radio düyməsini seçməklə çoxlu açar-dəyər cütləri əlavə edin x-www-form-urlencoded. Yəni ilk açar olacaq başlıq, onun dəyəri Qeyd Başlığım. İkinci açar - bədən, onun dəyəri Nə gözəl qeyddir.

Bu, API tərəfindən emal edilə bilən sorğuya kodlanmış məlumatları əlavə edəcək.


Qeydimin başlığı və yazının özü çox sadədir, lakin burada təsəvvürünüzü göstərə bilərsiniz

Faylda note_route.js, sadəcə qeydin gövdəsini konsola çap edin.

// note_routes.js module.exports = funksiya(app, db) ( app.post("/notes", (req, res) => ( console.log(req.body) res.send("Salam") ) ); );
Poçtalyondan istifadə edərək sorğu göndərməyə cəhd edin və görəcəksiniz... qeyri-müəyyən.

Təəssüf ki, Express URL ilə kodlanmış formaları təkbaşına idarə edə bilməz. Burada əvvəllər quraşdırılmış bədən-parser paketi köməyimizə gələcək.

// server.js const express = tələb ("express"); const MongoClient = tələb edir("mongodb").MongoClient; const bodyParser = tələb edir("bədən-parser"); const app = express(); const port = 8000; app.use(bodyParser.urlencoded(( uzadılmış: doğru ))); tələb ("./app/routes")(tətbiq, ()); app.listen(port, () => ( console.log("Biz canlı yayımdayıq " + port); ));
İndi POST sorğusunu yerinə yetirdikdən sonra onun gövdəsi terminalda obyekt kimi görünə bilər.

(başlıq: "Mənim qeydim başlığı", əsas hissə: "Nə gözəl qeyddir.")
Birinci marşrutun tam işləməsi üçün verilənlər bazasını konfiqurasiya etmək və ona qeyd əlavə etmək qalır.

Verilənlər bazasını tez yaratmaq və konfiqurasiya etmək üçün biz mLab xidmətindən istifadə edəcəyik. Onunla işləmək asandır və kiçik miqdarda məlumat üçün pulsuzdur.

mLab veb saytında hesab yaradın və yeni MongoDB verilənlər bazası yerləşdirin. Bunu etmək üçün düyməni basın Yaradın Yeni Fəsildə MongoDB Yerləşdirmələri, görünən pəncərədə, bölmədə Plan, seçin Tək düyünlü. Siyahıda Standart xətt, seçin Sandbox və verilənlər bazasına ad verin. Sonra verilənlər bazası idarəetmə pəncərəsində nişana keçin İstifadəçilər və istifadəçi adı və parol göstərərək verilənlər bazası istifadəçisi əlavə edin.


Yeni verilənlər bazası istifadəçisi

Eyni səhifədən ikinci URL-ni kopyalayın - verilənlər bazası əlaqə sətri.


Verilənlər bazasına qoşulmaq üçün URL

Layihənin kökünə bir kataloq əlavə edin konfiqurasiya, onda fayl yaradın db.js.

Mkdir config cd config touch db.js
Sənədləşdirmək db.js aşağıdakıları əlavə edin:

Module.exports = (url: URL-iniz bura gedəcək);
İstifadəçi adınızı və şifrənizi URL-ə əlavə etməyi unutmayın (mLab hesabınız üçün deyil, verilənlər bazası üçün yaratdığınız). Layihəni Github-da yerləşdirirsinizsə, faylı daxil etməyinizə əmin olun .gitignore(bunun kimi). Bu yolla siz verilənlər bazası ilə işləmək üçün ad və parolu ictimailəşdirməyəcəksiniz.

İndi, in server.js, verilənlər bazasına qoşulmaq və proqram parametrlərini yaratarkən ona ötürülən funksiyaya bağlamaq üçün MongoClient-dən istifadə edə bilərsiniz:

// server.js const express = tələb ("express"); const MongoClient = tələb edir("mongodb").MongoClient; const bodyParser = tələb edir("bədən-parser"); const db = tələb edir ("./config/db"); const app = express(); const port = 8000; app.use(bodyParser.urlencoded(( uzadılmış: doğru ))); MongoClient.connect(db.url, (səhv, verilənlər bazası) => (əgər (səhv) qaytarılırsa console.log(səhv) tələb olunur("./app/routes")(tətbiq, verilənlər bazası); app.listen(port, () ) => ( console.log("Biz canlı yayımdayıq " + port); )); ))
Bununla da infrastrukturun hazırlanması başa çatır. Bundan sonra biz yalnız yollarla məşğul olacağıq.

Məlumat bazasına qeydlərin əlavə edilməsi

MongoDB məlumatları adlarına uyğun gələn kolleksiyalarda saxlayır. Bizim vəziyyətimizdə qeydlər, təxmin etdiyiniz kimi, qeydlər adlanacaq kolleksiyada saxlanılacaq.

Müştərinin quraşdırılması zamanı ona verilənlər bazası əlaqə sətri, db arqumenti verildi. Marşrut kodunda verilənlər bazasına aşağıdakı kimi daxil ola bilərsiniz:

Db.collection("qeydlər")
Verilənlər bazasında qeyd yaratmaq qeydlər kolleksiyası üçün daxiletmə əmrini çağırmağa bərabərdir:

Davamlı qeyd = ( mətn: req.body.body, başlıq: req.body.title) db.collection("qeydlər").insert(qeyd, (səhv, nəticələr) => ( )
Əmr uğurla tamamlandıqdan sonra (və ya nədənsə uğursuzluqdan sonra) ya yeni yaradılmış qeyd obyekti, ya da səhv mesajı ilə cavab verməlisiniz. Budur kod note_routes.js, bu mülahizələr nəzərə alınmaqla əlavə edilir:

// note_routes.js module.exports = funksiya(app, db) ( app.post("/notes", (req, res) => ( const note = ( mətn: req.body.body, başlıq: req.body) .title ); db.collection("qeydlər").insert(qeyd, (səhv, nəticə) =>
Nə əldə etdiyinizi sınayın. Poçtalyondan POST sorğusu göndərin (bayraqla x-www-form-urlencoded), nişanda təyin etməklə Bədən sahə dəyərləri başlıqbədən.

Cavab bu kimi görünməlidir:


Məlumat bazasına qeyd uğurla əlavə olunur

Oxu qeydləri: OXUMA marşrutu

Yuxarıda hazırladığımız infrastruktur bütün marşrutlar üçün uyğundur, ona görə də indi işlər daha sürətlə gedəcək.

Beləliklə, yolu izləyərək yeni yaratdığımız qeydi sorğulayacağıq localhost:8000/notlar/(qeyd id). Bizim vəziyyətimizdə yol belə görünəcək: localhost:8000/notes/585182bd42ac5b07a9755ea3.

Əgər sizdə artıq yaradılmış qeydlərdən birinin identifikatoru yoxdursa, mLab-da verilənlər bazasına baxıb onu orada tapa və ya yeni qeyd yarada və onun ID-sini kopyalaya bilərsiniz.

İçəridə göründüyü budur note_route.js:

// note_routes.js module.exports = funksiya(app, db) ( app.get("/notes/:id", (req, res) => ( )); app.post("/notes", (tələb) , res) => ( const note = ( mətn: req.body.body, başlıq: req.body.title ); db.collection("qeydlər").insert(qeyd, (səhv, nəticə) => ( əgər ( err) ( res.send(( "səhv": "Bir xəta baş verdi" )); ) else (res.send(nəticə.ops); ))) ); ); );
Əvvəlki kimi, biz qeydlər verilənlər bazası kolleksiyasında bəzi əmrləri çağıracağıq. Bunun üçün findOne metodundan istifadə edək.

// note_routes.js module.exports = funksiya(app, db) ( app.get("/notes/:id", (req, res) => ( const detalları = ( "_id":<ТУТ БУДЕТ ID>); db.collection("qeydlər").findOne(ətraflı məlumat, (səhv, maddə) => ( əgər (səhv) ( res.send(("xəta":"Bir xəta baş verdi")); ) else ( res.send (əşya); ))) ))) app.post("/notlar", (req, res) => ( const note = ( mətn: req.body.body, başlıq: req.body.title ); db.collection("qeydlər").insert(qeyd) , (səhv, nəticə) => ( if (səhv) ( res.send(( "səhv": "Bir xəta baş verdi" )); ) else ( res.send(result.ops); ) )); )) ; );
İdentifikator req.params.id konstruksiyasından istifadə edərək URL parametrlərindən çıxarıla bilər. Ancaq bunun əvəzinə sadəcə xətti daxil etsəniz<<>> yuxarıdakı koddan bu işləməyəcək.

MongoDB ID-ni sətir kimi deyil, xüsusi obyekt kimi tələb edir. Bu adlanır ObjectID.

Bəzi kiçik dəyişikliklərdən sonra əldə etdiyimiz budur:

// note_routes.js var ObjectID = tələb ("mongodb").ObjectID; module.exports = function(app, db) ( app.get("/notes/:id", (req, res) => ( const id = req.params.id; const details = ( "_id": new ObjectID (id) ); db.collection("qeydlər").findOne(ətraflı məlumat, (səhv, maddə) => ( if (səhv) ( res.send(("səhv":"Bir xəta baş verdi")); ) else ( res.send(element); ) )); )); app.post("/notes", (req, res) => ( const note = (mətn: req.body.body, başlıq: req.body) .title ); db.collection("qeydlər").insert(qeyd, (səhv, nəticə) => ( əgər (səhv)) ( res.send(( "səhv": "Səhv baş verdi" )); ) else ( res.göndər(nəticə.ops); ))) )); );
Bunu verilənlər bazasında mövcud olan qeyd ID-lərindən biri ilə sınayın. Postmandakı cavab belə görünməlidir:


Verilənlər bazasından qeyd üçün uğurlu sorğu

Qeydlərin silinməsi: marşrutu SİLİN

Obyektlərin silinməsi praktiki olaraq verilənlər bazasında onları axtarmaqla eynidir. Yalnız findOne funksiyasının əvəzinə sil funksiyası istifadə olunur. Budur, müvafiq yol üçün tam kod. Bu, GET sorğusunu idarə edən mövcud metoddakı koddan nə ilə fərqləndiyini vurğulayır.

// note_routes.js // ... app.delete("/notes/:id", (req, res) => ( const id = req.params.id; const details = ( "_id": new ObjectID( id) ); db.collection("qeydlər").remove(təfsilatlar, (səhv, maddə) => ( if (səhv) ( res.send(("səhv":"Bir xəta baş verdi")); ) else ( res.send("Qeyd" + id + "silindi!"); ) )); )); //...

Qeydlər yeniləməsi: YENİLƏNİB marşrut

Və burada son yoldur. PUT sorğusunun emalı mahiyyətcə READ və CREATE əməliyyatlarının hibrididir. Əvvəlcə obyekti tapmalı, sonra sorğuda alınan məlumatlara uyğun olaraq yeniləyin. İndi, əvvəlki kod parçasını sınaqdan keçirərkən yeganə qeydinizi silmisinizsə, başqa bir qeyd yaradın.

Budur qeydlərin yeniləmə marşrut kodu:

// note_routes.js // ... app.put ("/notes/:id", (req, res) => ( const id = req.params.id; const details = ( "_id": new ObjectID( id) ); const not = ( mətn: req.body.body, başlıq: req.body.title ); db.collection("qeydlər").update(ətraflı məlumat, qeyd, (səhv, nəticə) => ( əgər ( err) ( res.send(("xəta":"Bir xəta baş verdi")); ) else (res.send(qeyd); ) )); )); //...
İndi istənilən qeydi redaktə etmək olar. Göründüyü kimi:


Uğurlu qeyd yeniləməsi

Nümunəmizdəki qüsura diqqət yetirin. Əgər PUT sorğusunda qeydin əsas hissəsi və ya başlığı yoxdursa, verilənlər bazasındakı müvafiq sahələr sadəcə olaraq silinəcək.

Mən nümunəni əlavə yoxlamalarla yükləmədim. İstəyirsinizsə, siz qeydlərin yenilənməsi əməliyyatını özünüz dəyişdirə, verilənlər bazasına yeni məlumatlar əlavə etməklə yalnız sorğu düzgün formalaşdırıldıqda dəyişə bilərsiniz.

Nəticələr

İndi dörd əsas CRUD əməliyyatını dəstəkləyən işləyən Node API-yə sahibsiniz. Tətbiqin server hissəsi müştəri HTTP sorğularına cavab verərək verilənlər bazasında qeydlər yarada, onları tapa, silə və redaktə edə bilər.

Hekayəmin əsas məqsədi hər kəsi Node + Express + MongoDB kombinasiyası və server proqramlarının hazırlanması metodologiyası ilə tanış etməkdir. Əlbəttə ki, bu gün bu vasitələrlə ilk tanışlığınızdırsa, hər şeyi daha yaxşı başa düşmək üçün sənədləri oxumalısınız. Bununla belə, nə baş verdiyini başa düşmək sizə bilikdəki boşluqları tez bir zamanda doldurmağa və burada başlanğıc nöqtəsi olaraq üzərində işlədiyimiz tətbiqdən istifadə edərək öz layihələriniz üzərində işləməyə başlamağa imkan verəcək.

Node.js, Express və MongoDB ilə real layihələrdə işləmək təcrübəniz varsa, yeni başlayanlar üçün məsləhətiniz varmı? Bütün bunları ilk dəfə sınamısınızsa, təəssüratlarınızı gözləyirik.

$ npm Express quraşdırın

və ya ekspress əmrə çıxış əldə etmək üçün qlobal olaraq quraşdırın:

$ npm quraşdırma -g express

Sürətli başlanğıc

Express ilə işə başlamağın ən asan yolu tətbiqi yaradacaq ekspress əmri işə salmaqdır:

Tətbiq yaratmaq:

$ npm quraşdırma -g express $ express /tmp/foo && cd /tmp/foo

Asılılıqların quraşdırılması:

$ npm quraşdırma -d

Serverin işə salınması:

Server yaradılması

Express.HTTPServer nümunəsini yaratmaq üçün sadəcə createServer() metodunu çağırın. Tətbiq nümunəmizlə bu app.get() nümunəsində HTTP metodlarına əsaslanan marşrutları təyin edə bilərik.

var app = tələb("express").createServer(); app.get("/", funksiya(req, res)( res.send("salam dünya"); )); app.dinle(3000);

HTTPS serverinin yaradılması

Express.HTTPSServer-i işə salmaq üçün biz yuxarıdakı addımları yerinə yetiririk, lakin biz NodeJS https modul sənədlərində təsvir olunan açar, sertifikat və digər parametrlərdən ibarət seçim obyektini də ötürürük.

var app = tələb edir("express").createServer(( açar: ... ));

Konfiqurasiya

Express istehsal və inkişaf kimi ixtiyari mühitləri dəstəkləyir. Tərtibatçılar müəyyən mühit üçün lazım olan funksiyaları əlavə etmək üçün configure() metodundan istifadə edə bilərlər. Configure() mühit adı olmadan çağırılanda, mühitin təyin olunduğu hər hansı konfiqurasiya işə düşməzdən əvvəl o, istənilən mühitdə işə düşəcək.

Aşağıdakı misalda biz sadəcə olaraq dumpExceptions variantından istifadə edirik və inkişaf rejimində müştəriyə istisnanın yığın izi ilə cavab veririk. Hər iki rejimdə metodOverride və bodyParser qatlarından istifadə edirik. Marşrutların quraşdırılmasına imkan verən app.router istifadəsinə diqqət yetirin - əks halda onlar app.get() , app.post() və s. çağırılanda ilk dəfə quraşdırılır.

app.configure(function())( app.use(express.methodOverride()); app.use(express.bodyParser()); app.use(app.router); )); app.configure("inkişaf", function())( app.use(express.static(__dirname + "/public")); app.use(express.errorHandler(( dumpExceptions: true, showStack: true ))); ) ); app.configure("istehsal", function())( var oneYear = 31557600000; app.use(express.static(__dirname + "/public", ( maxAge: oneYear ))); app.use(express.errorHandler() ); )))

Oxşar parametrləri olan mühitlər üçün birdən çox mühit adını ötürə bilərsiniz:

app.configure("mərhələ", "məhsul", funksiya())( // konfiqurasiya ));

Daxili və ixtiyari parametrlər üçün Express-də set(key[, val]) , enable(key) , disable(key) metodları var:

app.configure(funksiya () ( app.set("baxışlar", __dirname + "/views"); app.set("baxışlar"); // => "/absolute/path/to/views" app.enable ("bəzi xüsusiyyət"); // app.set ilə eyni("bəzi xüsusiyyət", doğru); app.disable("bəzi xüsusiyyət"); // app.set ilə eyni("bəzi xüsusiyyət", yanlış) ; proqram .enabled("bəzi xüsusiyyət") // => false ));

Ətraf mühiti təyin etmək üçün NODE_ENV mühit dəyişənini təyin edə bilərik. Misal üçün:

$ NODE_ENV=istehsal node app.js

Bu çox vacibdir, çünki bir çox keşləmə mexanizmləri yalnız istehsal mühitində işə salınır.

Parametrlər

Qutudan çıxarılan Express aşağıdakı parametrləri dəstəkləyir:

  • home res.redirect() üçün istifadə edilən proqramın əsas yoludur, həmçinin quraşdırılmış proqramlar üçün şəffaf dəstəkdir.
  • views baxışların kök kataloqudur. Defolt olaraq cari_qovluq/baxışlar
  • görünüş mühərriki - fayl uzantısı olmadan çağırılan görünüşlər üçün standart şablon mühərriki.
  • baxış variantları - qlobal görünüş seçimlərini əks etdirən obyekt
  • görünüş önbelleği - görünüş keşini aktivləşdirin (istehsal mühitində aktivdir)
  • hərflərə həssas marşrutlar - hərflərə həssas marşrutları aktivləşdirin
  • ciddi marşrutlaşdırma - aktiv edilərsə, arxadakı kəsiklər artıq nəzərə alınmır
  • jsonp geri çağırış - res.send() metodunun JSONP-ni şəffaf şəkildə dəstəkləməsinə icazə verin

Marşrutlaşdırma

Express mənalı, ifadəli marşrutlaşdırma API təmin etmək üçün HTTP metodlarından istifadə edir. Məsələn, /user/12 axtarışında id=12 olan istifadəçinin profilini göstərmək istəyirik. Bunun üçün aşağıda marşrutu müəyyənləşdiririk. Adlandırılmış sahələrlə əlaqəli dəyərlər res.params obyektində mövcuddur.

app.get("/user/:id", funksiya(req, res)( res.send("user" + req.params.id); ));

Marşrut, sadəcə olaraq, mühərrik daxilində müntəzəm ifadəyə yığılmış bir sətirdir. Məsələn, /user/:id tərtib edildikdə, nəticə belə bir müntəzəm ifadədir:

\/istifadəçi\/([^\/]+)\/?

Siz həmçinin adi ifadəni dərhal ötürə bilərsiniz. Amma qruplar normal ifadələrdə ad verilmədiyi üçün onlara req.params-da rəqəmlərlə çatmaq olar. Beləliklə, birinci qrup req.params , ikincisi req.params və s.

app.get(/^\/users?(?:\/(\d+)(?:\.\.(\d+))?)?/, funksiya(req, res)( res.send(req.params) );)))

İndi curl götürək və yuxarıdakı marşruta sorğu göndərək:

$ curl http://dev:3000/user $ curl http://dev:3000/users $ curl http://dev:3000/users/1 ["1",null] $ curl http://dev: 3000/istifadəçi/1..15 ["1","15"]

Aşağıda onlara uyğun ola biləcək bəzi nümunə marşrutlar və yollar verilmişdir:

"/user/:id" /user/12 "/users/:id?" /users/5 /users "/files/*" /files/jquery.js /files/javascripts/jquery.js "/file/*.*" /files/jquery.js /files/javascripts/jquery.js "/ user/:id/:operation?" /user/1 /user/1/edit "/products.:format" /products.json /products.xml "/products.:format?" /products.json /products.xml /məhsullar "/user/:id.:format?" /user/12 /user/12.json

Məsələn, JSON sorğusunu (həmçinin digər sorğuları) təhlil edə və cavabı req.body-də yerləşdirə bilən bodyParser qatından istifadə edərək bəzi JSON-u POST edə və eyni JSON ilə cavab verə bilərik:

var express = tələb("express"), app = express.createServer(); app.use(express.bodyParser()); app.post("/", funksiya(req, res) ( res.send(req.body); )); app.dinle(3000);

Bir qayda olaraq, heç bir məhdudiyyəti olmayan "lal" sahəsindən (məsələn, /user/:id) istifadə edirik. Lakin, məsələn, istifadəçi identifikatorunu yalnız ədədi simvollarla məhdudlaşdırmaq istəsək, /user/:id(+) istifadə edə bilərik. Sahənin dəyəri rəqəmsal olmayan simvolları ehtiva edərsə, bu dizayn işləməyəcək.

İdarəetmənin başqa marşruta ötürülməsi

Üçüncü arqumentə, next() çağırmaqla, siz nəzarəti növbəti marşruta ötürə bilərsiniz. Uyğunluq tapılmazsa, idarəetmə yenidən Connect-ə ötürülür və laylar use() istifadə edərək aktivləşdirildiyi ardıcıllıqla çağırılmağa davam edir. Eyni yolu paylaşan bir neçə marşrut da işləyir. Onlardan biri next() çağırmaq əvəzinə cavab verənə qədər sadəcə bir-bir çağırılırlar.

app.get("/users/:id?", function(req, res, next) ( var id = req.params.id; if (id) ( // bir şey et ) başqa ( növbəti(); ) )) ; app.get("/users", function(req, res) ( // başqa bir şey edin ));

Bütün HTTP metodları üçün eyni məntiqi yerinə yetirmək istəyirsinizsə app.all() metodu faydalıdır. Aşağıda verilənlər bazasından istifadəçi çıxarmaq və onu req.user-ə təyin etmək üçün bu üsuldan istifadə edirik.

var express = tələb("express"), app = express.createServer(); var users = [(ad: "tj" )]; app.all("/user/:id/:op?", function(req, res, next) ( req.user = users; if (req.user) ( next(); ) else ( next(yeni Xəta() "istifadəçi tapılmadı" + req.params.id))) ))) app.get("/user/:id", funksiya(req, res) ( res.send("görünür" + req.user.name); )); app.get("/user/:id/edit", funksiya(req, res) ( res.send("redaktə " + req.user.name); )); app.put("/user/:id", funksiya(req, res) ( res.send("yenilənir" + req.user.name); )); app.get("*", funksiya(req, res) ( res.send("nə???", 404); )); app.dinle(3000);

Interlayerlər

Qoşulma çərçivə təbəqələri, adi Connect serverindən istifadə edildiyi kimi express.createServer()-ə ötürülə bilər. Misal üçün:

var express = tələb ("express"); var app = express.createServer(express.logger(), express.bodyParser());

Use() funksiyasından da istifadə edə bilərsiniz. Bu, daha mütərəqqi olan configure() bloklarının daxilində təbəqələrin əlavə edilməsini daha rahat edir.

app.use(express.logger(( format: ":metod:url" )));

Tipik olaraq Connect təbəqələri ilə biz Connect-i bu şəkildə birləşdirə bilərik:

var connect = tələb edir("qoşulmaq"); app.use(connect.logger()); app.use(connect.bodyParser());

Bu, tamamilə rahat deyil, buna görə də Express Connect təbəqələrini yenidən ixrac edir:

app.use(express.logger()); app.use(express.bodyParser());

Qatların sırası vacibdir. Beləliklə, Connect sorğu qəbul etdikdə createServer() və ya use() vasitəsilə əlavə edilən birinci qat yerinə yetirilir. Üç parametrlə çağırılır: sorğu, cavab və geri çağırış funksiyası, adətən növbəti adlanır. next() çağırıldıqda idarəetmə ikinci təbəqəyə ötürülür və s. Bunu nəzərə almaq vacibdir, çünki bir çox təbəqə bir-birindən asılıdır. Məsələn, methodOverride() HTTP metodunu həddən artıq yükləmək üçün req.body.method-u çağırır və bodyParser() req.body doldurmaq üçün sorğunun əsas hissəsini təhlil edir. Başqa bir nümunə kuki təhlili və sessiya dəstəyidir - əvvəlcə cookieParser() üzərində use() , sonra session() funksiyasına zəng etməlisiniz.

Bir çox Express proqramlarında app.use(app.router) xətti ola bilər. Bu qəribə görünə bilər, lakin bu, sadəcə olaraq bizim yaratdığımız bütün marşrutları ehtiva edən təbəqəni açıq şəkildə göstərmək üçündür. Bu təbəqə istənilən sıraya daxil edilə bilər, baxmayaraq ki, standart olaraq sonunda daxil edilir. Onun mövqeyini dəyişdirərək, onun icrası qaydasına nəzarət edə bilərsiniz. Məsələn, bizə bütün digər təbəqələrdən sonra işə düşəcək və next() istifadə edərək ona ötürülən hər hansı bir istisnanı göstərəcək bir səhv idarəçisinə ehtiyacımız var. Yaxud statik fayllara xidmət edən təbəqənin icra sırasını aşağı salmaq lazım gələ bilər ki, digər marşrutlar belə fayllar üçün sorğuların qarşısını alsın və məsələn, yükləmələrin sayını və s. saysın. Bunun necə görünə biləcəyi budur:

app.use(express.logger(...)); app.use(express.bodyParser(...)); app.use(express.cookieParser(...)); app.use(express.session(...)); app.use(app.router); app.use(express.static(...)); app.use(express.errorHandler(...));

Əvvəlcə logger() əlavə edirik - o, bizə cavab dərəcəsi məlumatını vermək üçün req.end() metodunu əhatə edəcək. Sonra sorğu orqanını (əgər varsa), sonra kukiləri, sonra sessiyanı təhlil edirik ki, app.router-də marşrutlara çatanda req.session artıq müəyyənləşsin. Məsələn, /javascripts/jquery.js-ə GET sorğusu marşrutlar tərəfindən idarə edilirsə və biz next() çağırmırıqsa, static() təbəqəsi heç vaxt həmin sorğunu qəbul etməyəcək. Bununla belə, aşağıda göstərildiyi kimi marşrut təyin etsək, statistik məlumatları qeyd etmək, yükləmələri rədd etmək, yükləmələri yükləmək və s. mümkün olacaq.

var endirmələr = (); app.use(app.router); app.use(express.static(__dirname + "/public")); app.get("/*", function(req, res, next) ( var fayl = req.params; endirmələr = endirmələr || 0; endirmələr++; sonrakı(); ));

Qat marşrutları

Marşrutlar metoda əlavə geri çağırışlar (və ya massivlər) ötürməklə marşrutlaşdırma qatlarından istifadə edə bilər. Bu, marşrutdan istifadə etməzdən əvvəl girişi məhdudlaşdırmaq və ya hər hansı məlumatı yükləmək lazım olduqda faydalıdır.

Tipik olaraq, asinxron məlumat axtarışı aşağıda göstərilən kimi görünə bilər (burada biz:id parametrini götürürük və istifadəçi məlumatlarını yükləyirik).

app.get("/user/:id", function(req, res, next) ( loadUser(req.params.id, function(səhv, user)) (əgər (səhv) növbətini qaytarır(səhv); res.send( "İstifadəçiyə baxılır" + user.name); )); ));

DRY prinsipinə riayət etmək və kodun oxunuşunu yaxşılaşdırmaq üçün təbəqələrdən istifadə edərək belə məntiqi təşkil edə bilərsiniz. Gördüyünüz kimi, təbəqələrdən istifadə edərək məntiqi mücərrəd etməklə həm təbəqələrin təkrar istifadəsinə nail ola bilərsiniz, həm də marşrut kodunu daha gözəl edə bilərsiniz.

funksiyası loadUser(req, res, next) ( // burada biz istifadəçini verilənlər bazasından yükləyirik var user = users; if (user) ( req.user = user; next(); ) else ( next(yeni Xəta("Uğursuz) istifadəçini yükləmək üçün " + req.params.id)); ) ) app.get("/user/:id", loadUser, funksiya(req, res) ( res.send("İstifadəçiyə baxılır" + req.user.name ); )))

Çoxlu marşrutlaşdırma qatları əlavə edilə bilər və onlar istifadəçi hesabına girişi məhdudlaşdırmaq kimi müxtəlif məntiqi təmin etmək üçün ardıcıl olaraq icra ediləcək. Aşağıdakı nümunədə yalnız səlahiyyətli istifadəçi öz hesabını redaktə edə bilər.

funksiyası andRestrictToSelf(req, res, next) ( req.authenticatedUser.id == req.user.id ? next() : sonrakı(yeni Xəta("İcazəsiz")); ) app.get("/user/:id/ redaktə et", loadUser, andRestrictToSelf, function(req, res) ( res.send("Req.user.name); ));

Qatların sadəcə funksiyalar olduğunu qəbul edərək, aşağıda göstərildiyi kimi təbəqəni qaytaran (daha ifadəli və çevik həll təmin etmək üçün) funksiya yaza bilərsiniz.

funksiyası andRestrictTo(role) ( qaytarılması funksiyası(req, res, next) ( req.authenticatedUser.role == role ? next() : next(yeni Xəta("İcazəsiz")); ) ) app.del("/user/ :id", loadUser, andRestrictTo("admin"), function(req, res) ( res.send("Silinmiş istifadəçi " + req.user.name); ));

Tez-tez istifadə olunan təbəqələrin "yığınları" ixtiyari dərinlik və ağac quruluşu massivləri kimi ötürülə bilər (onlar rekursiv şəkildə tətbiq olunacaq):

var a = , b = , hamısı = ; app.get("/foo", a, function() ()); app.get("/bar", a, function() ()); app.get("/", a, ara proqram3, ara proqram4, funksiya() ()); app.get("/", a, b, function() ()); app.get("/", hamısı, funksiya() ());

Tam nümunəyə depoda baxmaq olar.

Yığında qalan marşrut qatlarını atlamalı olduğunuz vaxtlar olur, lakin növbəti marşrutları icra etməyə davam edin. Bunu etmək üçün marşrut arqumenti ilə next() çağırın: next("marşrut") . İcra etmək üçün heç bir marşrut yoxdursa, Express 404 Tapılmadı xətası ilə cavab verəcəkdir.

HTTP üsulları

Biz artıq dəfələrlə app.get() istifadə etmişik, lakin Express digər HTTP üsullarını da təmin edir - app.post() , app.del() və s.

POST üçün ən ümumi istifadə forması təqdim edərkən olur. Aşağıdakı nümunədə biz sadəcə olaraq HTML formasını hazırlayırıq. Və sonra nəzarət növbəti misalda müəyyən edəcəyimiz marşruta köçürüləcək.

Varsayılan olaraq, Express sorğunun mətni ilə nə edəcəyini bilmir, ona görə də biz application/x-www-form-urlencoded və ya application/json-da kodlanmış sorğu orqanını təhlil edəcək bodyParser() qatını əlavə etməliyik. təhlil nəticələri req .body . Bunu etmək üçün aşağıdakı kimi use() deməliyik:

app.use(express.bodyParser());

İndi aşağıdakı marşrut ad və e-poçt xassələrinə malik olan req.body.user obyektinə daxil olacaq:

app.post("/", funksiya(req, res) ( console.log(req.body.user); res.redirect("geri"); ));

Əgər forma PUT kimi metodlardan istifadə edirsə, siz HTTP metodunu dəyişməyə imkan verən _method adlı gizli girişdən istifadə edə bilərsiniz. Buna nail olmaq üçün biz ilk öncə bodyParser()-dan sonra yerləşdiriləcək metodOverride() qatını aktiv etməliyik ki, bu da ona təqdim edilmiş formanın sahələrini ehtiva edən req.body-dən istifadə etməyə imkan verəcək.

app.use(express.bodyParser()); app.use(express.methodOverride());

Bu təbəqələr defolt olaraq aktiv edilmir, çünki Express dərhal tam funksionallığa malik deyil. Tətbiqin ehtiyaclarından asılı olaraq, onlardan istifadə etmək lazım olmaya bilər. Və sonra PUT və DELETE üsulları hələ də mövcud olacaq, lakin birbaşa. Eyni zamanda methodOverride HTML formaları üçün əla həlldir. Aşağıda PUT metodundan istifadə nümunəsi verilmişdir:

app.put("/", function() ( console.log(req.body.user); res.redirect("geri"); ));

Emal zamanı xəta

Express-də marşrutlar tərəfindən atılan və ya növbəti(err) kimi keçən hər hansı istisnaları qəbul edən app.error() metodu var. Aşağıda evdə hazırlanmış NotFound istisnasından istifadə edərək birdən çox səhifəyə xidmət göstərməyin nümunəsi verilmişdir:

funksiya NotFound(msg) ( this.name = "Tapılmadı"; Error.call(bu, msg); Error.captureStackTrace(bu, arguments.callee); ) NotFound.prototype.__proto__ = Xəta.prototip; app.get("/404", funksiya(req, res) (yeni NotFound at; )); app.get("/500", funksiya(req, res) (yeni Xəta atmaq("klaviatura pişiyi!"); ));

Aşağıda göstərildiyi kimi app.error() funksiyasına bir neçə dəfə zəng edə bilərsiniz. Burada NotFound instance-ı yoxlayırıq və 404 səhifəsini göstəririk və ya nəzarəti növbəti xəta idarəçisinə ötürürük.

Qeyd edək ki, bu işləyicilər hər yerdə müəyyən edilə bilər, çünki onlar hələ də listen() -də marşrut idarəedicilərinin altında yerləşdiriləcək. Bu, onları configure() blokları daxilində müəyyən etməyə imkan verir ki, istisnalar mövcud mühitdən asılı olaraq fərqli şəkildə idarə olunsun.

app.error(funksiya(səhv, tələb, res, sonrakı) ( if (səhv tapılmadı) ( res.render("404.jade"); ) else (növbəti(səhv); ) ));

Sadəlik naminə burada bütün səhvlərin 500 kodu olduğunu fərz edirik, lakin siz bunu istədiyiniz kimi dəyişə bilərsiniz. Məsələn, Node fayl sistemi əməliyyatlarını yerinə yetirdikdə, biz xəta obyekti əldə edə bilərik error.code = ENOENT sahəsi, yəni "fayl və ya kataloq tapılmadı" biz bunu səhv idarəedicidə istifadə edə və müvafiq səhifəni göstərə bilərik.

app.error(funksiya(səhv, tələb, res) ( res.render("500.jade", ( xəta: səhv )); ));

Tətbiqlər istisnaları idarə etmək üçün Connect-in errorHender qatından da istifadə edə bilər. Məsələn, inkişaf mühitində stderr-də istisnalar göstərmək lazımdırsa, bunu edə bilərsiniz:

app.use(express.errorHandler(( dumpExceptions: true )));

Həmçinin, inkişaf zamanı bizə atılan və ya atılan istisnaları göstərən gözəl HTML səhifələrinə ehtiyacımız ola bilər. Bu halda showStack-i doğru olaraq təyin etməlisiniz:

app.use(express.errorHandler(( showStack: doğru, dumpExceptions: doğru )));

AJAX proqramlarını inkişaf etdirmək üçün faydalı olan Accept: application/json başlığı müştəri tərəfindən ötürülürsə, errorHandler təbəqəsi də JSON-da cavab verir.

Marşrut parametrlərinin əvvəlcədən işlənməsi

Əvvəlcədən emal edilmiş marşrut parametrləri açıq məlumatların yüklənməsi və sorğu URL-nin doğrulanması vasitəsilə tətbiqin oxunma qabiliyyətini əhəmiyyətli dərəcədə yaxşılaşdıra bilər. Məsələn, müəyyən sorğular üçün daim bəzi məlumatları əldə edirsinizsə (məsələn, /user/:id üçün istifadəçi məlumatlarını yükləyirsiniz), siz bu kimi bir şey edə bilərsiniz:

app.get("/user/:userId", function(req, res, next) ( User.get(req.params.userId, function(səhv, user)) (əgər (səhv) növbəti (səhv) qaytarılır); res. send("user" + user.name); ))) ));

İlkin şərtlərlə biz sorğu parametrlərimizə doğrulama aparan, girişi məhdudlaşdıran və ya verilənlər bazasından məlumat yükləyən geri çağırış funksiyalarını əlavə edə bilərik. Aşağıdakı nümunədə biz geri çağırış əlavə etmək istədiyimiz parametrin adı ilə app.param() çağırırıq. Gördüyünüz kimi, sahənin adını ehtiva edən bir id arqumenti alırıq. Bu yolla biz istifadəçi obyektini yükləyirik və adi xətanın idarə edilməsini həyata keçiririk və nəzarəti növbəti ilkin şərtə və ya marşrut idarəedicisinə ötürmək üçün next()-ə sadə zəng edirik.

app.param("userId", function(req, res, next, id) ( User.get(id, function(err, user)) (əgər (səhv) növbəti(səhv); əgər (!user) növbəti qayıdırsa(! new Error("istifadəçi tapmaq alınmadı")); req.user = user; next(); )); ));

Yuxarıdakı addımlar, artıq qeyd edildiyi kimi, kodun oxunuşunu əhəmiyyətli dərəcədə yaxşılaşdırır və eyni məntiqi tətbiqin müxtəlif yerlərində istifadə etməyi asanlaşdırır:

app.get("/user/:userId", funksiya(req, res) ( res.send("user" + req.user.name); ));

Görünüşlərin göstərilməsi

Fayl adlarına baxın sxemə (ad) baxın. (mühərrik), burada (mühərrik) qoşulmalı olan şablon mühərrik modulunun adıdır. Məsələn, layout.ejs görünüşü görünüş sisteminə tələb edir("ejs") . Express ilə inteqrasiya etmək üçün yüklənə bilən modul metodu ixrac etməlidir, exports.compile(str, options) və funksiyanı qaytarmalıdır. Bu davranışı dəyişdirmək üçün siz app.register() metodundan istifadə edə bilərsiniz - bu, fayl uzantılarını xüsusi mühərriklərlə əlaqələndirməyə imkan verir. Məsələn, motor tərəfindən göstərilən foo.html edə bilərsiniz ejs.

Aşağıda istifadə nümunəsidir Jade index.html göstərmək üçün. Və biz layout:false istifadə etmədiyimiz üçün, index.jade görünüşünün göstərilən məzmunu layout.jade görünüşünə yerli əsas dəyişən kimi ötürüləcək.

app.get("/", function(req, res) ( res.render("index.jade", ( başlıq: "Mənim Saytım" )); ));

Görünüş mühərrikinin qurulması sizə standart şablon mühərrikini təyin etməyə imkan verir. Beləliklə, məsələn, Jade istifadə edərkən bunu edə bilərsiniz:

app.set("görüntü mühərriki", "yeşim");

bu bizə belə göstərməyə imkan verəcək:

res.render("indeks");

Ancaq belə deyil:

res.render("indeks.yeşim");

Şablon mühərriki görünüş mühərriki vasitəsilə quraşdırıldıqda, fayl uzantılarına ehtiyac yoxdur. Bununla belə, biz yenə də eyni anda bir neçə şablon mühərrikindən istifadə edə bilərik:

res.render("başqa səhifə.ejs");

Ekspresdə həmçinin görünüş hər dəfə göstərildikdə tətbiq olunacaq görünüş seçimləri parametri var. Məsələn, planlardan tez-tez istifadə etmirsinizsə, bunu belə yaza bilərsiniz:

app.set("seçimlərə baxmaq", ( layout: false ));

Bu, lazım olduqda, res.render() -ə edilən zəngdə həddindən artıq yüklənə bilər:

res.render("myview.ejs", ( layout: true ));

Fərqli tərtibata ehtiyacınız olduqda, yolu da təyin edə bilərsiniz. Məsələn, əgər görünüş mühərrikimiz jade olaraq təyin edilmişsə və tərtibat faylı ./views/mylayout.jade adlanırsa, biz sadəcə olaraq keçə bilərik:

res.render("səhifə", ( layout: "mylayout" ));

Əks halda, fayl uzantısını ötürə bilərsiniz:

res.render("səhifə", ( tərtibat: "mylayout.jade" ));

Yollar da mütləq ola bilər:

res.render("səhifə", ( layout: __dirname + "/../../mylayout.jade" ));

Yaxşı bir nümunə, qeyri-standart açılış və bağlanma mühərrik etiketlərini təyin etməkdir ejs:

app.set("seçimlərə baxmaq", ( açıq: "((", bağla: "))" ));

Fraqmentlərə baxın

Ekspress görünüş sistemi fraqmentlər və kolleksiyalar üçün daxili dəstəyə malikdir, bir növ mini-görünüşdür. Məsələn, şərhlərin siyahısını göstərmək üçün görünüşdə dövrə vurmaq əvəzinə, sadəcə kolleksiya fraqmentindən istifadə edə bilərsiniz:

qismən("şərh", (toplama: şərhlər));

Digər seçimlər və ya yerli dəyişənlərə ehtiyac yoxdursa, siz obyekti atlaya və sadəcə məlumat massivinə keçə bilərsiniz. Aşağıdakı nümunə əvvəlkinə bərabərdir:

qismən("şərh", şərhlər);

Kolleksiyalardan istifadə edərkən bir neçə "sehrli" yerli dəyişənlərimiz var:

  • firstInCollection - bu ilk obyektdirsə doğrudur
  • indexInCollection - kolleksiyadakı obyektin indeksi
  • lastInCollection - bu sonuncu obyektdirsə doğrudur
  • kolleksiyaUzunluğu - kolleksiya uzunluğu

Keçirilmiş və ya yaradılan yerli dəyişənlər üstünlük təşkil edir, lakin ana görünüşə ötürülən yerli dəyişənlər uşaq görünüş üçün də əlçatandır. Məsələn, biz qismən("blog/post", post) istifadə edərək bir görünüş təqdim etsək və o, yerli dəyişən yazı yaradırsa və bu funksiyanı çağıran görünüşdə yerli dəyişən istifadəçi varsa, o zaman istifadəçi də bloqda görünəcək. /post görünüşü.

Əlavə sənədlər üçün res.partial()-a baxın.

Qeyd: Kolleksiyaları diqqətlə istifadə edin, çünki 100 elementdən ibarət massiv göstərmək 100 baxış göstərmək deməkdir. Sadə kolleksiyalar üçün kolleksiyalardan istifadə etməkdənsə, görünüşdən keçmək daha yaxşıdır. Bu şəkildə yük daha az olacaq.

Baxışları axtarın

Baxışlar ana görünüşə nisbətən axtarılır. Məsələn, əgər bizdə view views/user/list.jade varsa və onun daxilində biz qismən("redaktə") adlandırırıqsa, sistem baxışları/user/edit.jade-i yükləməyə çalışacaq, halbuki qismən("../" mesajlar") baxışların/messages.jade yüklənməsi ilə nəticələnəcək

Görünüş sistemi həmçinin indeks faylları yaratmağa imkan verir. Məsələn, biz res.render("istifadəçilər") çağıra bilərik və bu həm views/users.jade, həm də views/users/index.jade yükləyə bilər.

Siz həmçinin eyni kataloqdakı görünüşdən indeks fayllarından istifadə edə bilərsiniz. Beləliklə, qismən("istifadəçilər") zəng etmək qismən("index") zəng etmək əvəzinə ../users/index görünüşünə daxil ola bilər.

Şablon mühərrikləri

Aşağıda Express ilə ümumi istifadə edilən bir neçə şablon mühərriki verilmişdir:

  • E.J.S.- daxili JavaScript
  • CoffeeKup- şablon əsasında CoffeeScript
  • jQuery şablonları Node üçün

Sessiya dəstəyi

Sessiya dəstəyi Connect-in sessiya qatından istifadə etməklə aktivləşdirilə bilər. Həmçinin bunun üçün bizə kukiləri təhlil edəcək və onları req.cookies-ə yerləşdirəcək üst-üstə düşən kukiParser təbəqəsi lazımdır.

app.use(express.cookieParser()); app.use(express.session(( gizli: "klaviatura pişiyi" )));

Varsayılan olaraq, sessiya qatı Connect-in yaddaşdaxili yaddaşından istifadə edir, lakin bir çox başqa həllər var. Misal üçün birləşdirin-redis sessiya saxlanmasını dəstəkləyir Redis. Bunu necə istifadə etmək olar:

var RedisStore = require("connect-redis")(express); app.use(express.cookieParser()); app.use(express.session(( gizli: "klaviatura pişiyi", mağaza: yeni RedisStore )));

İndi req.session və req.sessionStore xassələri bütün marşrutlardan və sonrakı təbəqələrdən əlçatan olacaq. Req.session xassələri cavabdan sonra avtomatik olaraq saxlanılır. Səbətinizi necə təşkil etmək olar:

var RedisStore = require("connect-redis")(express); app.use(express.bodyParser()); app.use(express.cookieParser()); app.use(express.session(( gizli: "klaviatura pişiyi", mağaza: yeni RedisStore ))); app.post("/add-to-cart", function(req, res) ( // deyək ki, biz formadan bir neçə obyekt keçdik // bu var elementləri üçün bodyParser() istifadə edin = req.body.items; tələb. sessiya. elementlər = maddələr; res.redirect("geri"); )); app.get("/add-to-cart", function(req, res) ( // GET /add-to-cart-a yönləndirdiyimiz zaman // req.session.items && req.session.items . uzunluğu // mesajımızı çap etmək üçün if (req.session.items && req.session.items.length) ( req.flash("info", "Səbətinizdə %s element var", req.session.items. length ); ) res.render("alış-veriş sepeti"); ));

req.session obyektində həmçinin sessiyaların manipulyasiyası üçün Session.touch() , Session.destroy() , Session.regenerate() üsulları var. Ətraflı məlumat üçün Qoşulma Sessiyasının sənədlərinə baxın.

Miqrasiya Bələdçisi

Express 1.x ilə işləmiş tərtibatçılar proqramlarını Express 2.x, Connect 1.x və Node 0.4.x ilə işləmək üçün miqrasiya təlimatına müraciət edə bilərlər.

Sorğu

req.header(açar[, defaultValue])

İsteğe bağlı defolt DefaultValue ilə əsas sorğu başlığını (böyük hərflərə həssas deyil) əldə edin:

req.header("Host"); req.header("host"); req.header("Qəbul edirəm", "*/*");

Referrer və Referer başlıqları xüsusi haldır; hər iki konstruksiya işləyəcək:

// başlığı göndərdi "Referrer: http://google.com" req.header("Referer"); // => "http://google.com" req.header("Referrer"); // => "http://google.com"

tələb qəbul edir(növ)

Accept başlığının keçib-keçilmədiyini və verilən tipə uyğun olub-olmadığını yoxlayır.

Qəbul başlığı olmadıqda, doğru qaytarılır. Əks halda, növ uyğun gəlir və sonra alt növlər yoxlanılır. MIME axtarış cədvəlindən istifadə edərək daxili olaraq "text/html"-ə çevrilən "html"-i ötürmək mümkündür.

// Qəbul edin: mətn/html req.accepts("html"); // => doğru // Qəbul et: mətn/*; application/json req.accepts("html"); req.accepts("mətn/html"); req.accepts("mətn/düz"); req.accepts("application/json"); // => true req.accepts("şəkil/png"); req.accepts("png"); // => yalan

tələb(növ)

Məzmun Tipi başlığının mövcudluğu üçün daxil olan sorğunu yoxlayır və göstərilən MIME növünə uyğun gəlir.

// Content-Type: text/html; charset=utf-8 req.is("html"); req.is("mətn/html"); // => true // İndi Məzmun Növü application/json req.is("json"); req.is("application/json"); // => true req.is("html"); // => yalan

Express-də siz müxtəlif sorğu yoxlamaları üçün öz geri zənglərinizi qeydiyyatdan keçirə bilərsiniz. Məsələn, deyək ki, gələn sorğunun şəkil olub-olmadığını yoxlamaq üçün gözəl yoxlama aparmalıyıq. Bunu etmək üçün "şəkil" geri çağırışını qeyd edə bilərsiniz:

app.is("şəkil", funksiya(req) (qaytarmaq 0 == tələb.başlıqlar["məzmun növü"].indexOf("şəkil"); ));

İndi siz "image/jpeg", "image/png" və s. formaların Məzmun Növünü yoxlamaq üçün marşrut idarəçiləri içərisində istifadə edə bilərsiniz.

app.post("/image/upload", function(req, res, next) ( if (req.is("an image")) ( // müəyyən hərəkətləri yerinə yetirmək ) else ( next(); ) ));

Unutmayın ki, bu metod təkcə Məzmun Tipinə aid deyil - siz istənilən növ yoxlamaları edə bilərsiniz.

Siz həmçinin joker simvollardan istifadə edə bilərsiniz. Bu, şəkil nümunəmizi sadələşdirəcək. Burada yalnız növü yoxlayacağıq:

req.is("şəkil/*");

Aşağıda göstərildiyi kimi alt növü də yoxlaya bilərik. Burada çek "application/json" və "text/json" hallarda doğru qaytarılacaq.

req.is("*/json");

req.param(ad[, default])

Parametr adının dəyərini qaytarır və ya - mövcud deyilsə - default .

Marşrut parametrlərini (req.params) yoxlayır, məsələn, /user/:id

Sorğu sətirinin parametrlərini yoxlayır (req.query), məsələn, ?id=12

Sorğu orqanının (req.body) urlencoded parametrlərini yoxlayır, məsələn, id=12

Urlenkodlu sorğunun əsas parametrlərini qəbul etmək üçün req.body obyekti mövcud olmalıdır. Bunun üçün bodyParser() qatını aktivləşdirin.

req.get(sahə, param)

Başlıq sahəsinin parametrini alır. Standart boş sətirdir.

req.get("content-disposition", "fayl adı"); // => "bir şey.png" req.get("Məzmun növü", "sərhəd"); // => "--foo-bar-baz"

req.flash(növ[, mesaj])

Açılan mesajı növbəyə qoyur.

req.flash("məlumat", "e-poçt göndərildi"); req.flash("xəta", "e-poçt göndərişi alınmadı"); req.flash("məlumat", "e-poçt yenidən göndərildi"); // => 2 req.flash("info"); // => ["e-poçt göndərildi", "e-poçt yenidən göndərildi"] req.flash("info"); // => req.flash(); // => ( xəta: ["e-poçt çatdırılması uğursuz oldu"], məlumat: )

Pop-up mesajlar format sətirlərindən də istifadə edə bilər. Defolt "%s" sətri mövcuddur:

req.flash("info", "_%s_ ünvanından _%s_ ünvanına e-poçt çatdırılması uğursuz oldu.", toUser, fromUser);

req.isXMLHttpRequest

Həmçinin qısaldılmış req.xhr. Sorğunun XMLHttpRequest istifadə edərək edilib-edilmədiyini görmək üçün X-Requested-With başlığını yoxlayır:

req.xhr req.isXMLHttpRequest

Cavab

res.başlıq(açar[, val])

Cavab başlığını alır və ya təyin edir.

res.header("Məzmun uzunluğu"); // => təyin olunmamış res.header("Məzmun-uzunluq", 123); // => 123 res.header("Məzmun uzunluğu"); // => 123

res.charset

Aşağıdakı Məzmun Tipi başlıqların kodlaşdırılmasını təyin edir. Məsələn, res.send() və res.render() standart olaraq "utf8" olacaq və biz şablonu təqdim etməzdən əvvəl açıq şəkildə kodlaşdırmanı təyin edə bilərik:

res.charset = "ISO-8859-1"; res.render("istifadəçilər");

və ya res.send() ilə cavab verməzdən əvvəl:

res.charset = "ISO-8859-1"; res.send(küç);

və ya Node-un daxili res.end() funksiyasından istifadə edərək:

res.charset = "ISO-8859-1"; res.header("Məzmun növü", "mətn/düz"); res.end(küç);

res.contentType(növ)

Məzmun Tipi cavab başlığını təyin edir.

var fayl adı = "path/to/image.png"; res.contentType(fayl adı); // Məzmun növü indi "şəkil/png"dir

Siz həmçinin aşağıdakı sətirlə Content-Type təyin edə bilərsiniz:

res.contentType("application/json");

Və ya sadəcə fayl uzantısı (aparıcı nöqtə olmadan):

res.contentType("json");

res.attachment()

Content-Disposition cavab başlığını "qoşma" olaraq təyin edir. İstəyə görə, fayl adı ötürülə bilər.

res.attachment("yol/to/mənim/şəklim.png");

res.sendfile(yol[, seçimlər[, geri çağırış]])

İxtiyari faylı ötürmək üçün res.download()-da istifadə olunur.

res.sendfile("yol/to/mənim.fayl");

Bu üsul, fayl ötürülməsi uğursuz olarsa və ya uğur qazanarsa, çağırılan isteğe bağlı geri çağırış parametri götürür. Varsayılan olaraq, next(err) çağırılır, lakin geri çağırış ötürülürsə, bu, açıq şəkildə edilməlidir və ya xətanı idarə etməlidir.

res.sendfile(yol, funksiya(səhv) ( if (səhv) ( sonrakı(səhv); ) else ( console.log("transferred %s", yol); ) ));

Siz həmçinin seçimləri fs.createReadStream() çağırışına ötürə bilərsiniz. Məsələn, bufer ölçüsünü dəyişdirmək üçün:

res.sendfile(yol, ( bufferSize: 1024 ), funksiya(səhv) ( // emal olunur... ));

res.download(fayl[, fayl adı[, geri çağırış[, geri çağırış2]]])

Bu faylı qoşma kimi yükləyin (isteğe bağlı alternativ fayl adı təyin edə bilərsiniz).

res.download('path/to/image.png');

res.download('path/to/image.png', 'foo.png');

Bu, aşağıdakılara bərabərdir:

res.attachment(fayl); res.sendfile(fayl);

İstəyə görə, res.sendfile() üçün ikinci və ya üçüncü arqument kimi geri çağırışı təyin edə bilərsiniz. Onun daxilində başlıq hələ ötürülməmiş kimi cavab verə bilərsiniz.

res.download(yol, "xərclər.doc", funksiya(xəta) ( // emal... ));

Siz həmçinin isteğe bağlı olaraq ikinci geri çağırış keçirə bilərsiniz - geri çağırış2 . Bağlantı ilə əlaqəli səhvləri idarə edir. Bununla belə, cavab göndərməyə cəhd etməməlidir.

res.download(yol, funksiya(səhv) ( // xəta və ya xitam), funksiya(səhv) ( // əlaqə xətası ));

res.send(bədən|status[, başlıqlar|status[, status]])

Res.send() metodu obyektləri (JSON cavabı üçün), sətirləri (HTML cavabı üçün), Bufer nümunələrini və ya status kodunu (404, 500 və s.) təyin edən tam ədədləri ötürməyə imkan verən yüksək səviyyəli cavab vasitəsidir. .). Onun necə istifadə olunduğu belədir:

res.send(); // 204 res.send(yeni Bufer("wahoo")); res.send(( bəziləri: "json" )); res.send(""); res.send("Bağışlayın, bunu tapa bilmirəm", 404); res.send("mətn", ( "Məzmun növü": "mətn/düz" ), 201); res.send(404);

Varsayılan olaraq, Məzmun Tipi başlığı avtomatik olaraq təyin edilir. Bununla belə, əgər o, res.send()-də və ya res.header() istifadə etməzdən və ya res.contentType() istifadə etməzdən əvvəl əl ilə təyin edilibsə, o zaman avtomatik təyin edilməyəcək.

Nəzərə alın ki, bu metod cavabı bitirir (res.end()-ə bənzər), buna görə də birdən çox cavab və ya axın hazırlamağınız lazımdırsa, res.write() istifadə etməlisiniz.

res.json(obj[, başlıqlar|status[, status]])

Əlavə başlıqlar və status kodu ilə JSON cavabı göndərir. Bu üsul JSON API təşkil etmək üçün idealdır, lakin JSON res.send(obj) vasitəsilə də göndərilə bilər (yalnız JSON kodlu sətir göndərmək istəyirsinizsə, bu ideal deyil, çünki res.send(string) HTML göndərəcək)

res.json(null); res.json(( istifadəçi: "tj" )); res.json("qoruyucu!", 500); res.json("Heç nə tapılmadı", 404);

res.redirect(url[, status])

Göstərilən URL-ə yönləndirir. Standart status kodu 302-dir.

res.redirect("/", 301); res.redirect("/hesab"); res.redirect("http://google.com"); res.redirect("ev"); res.redirect("geri");

Express yönləndirmələr üçün qısa yolları dəstəkləyir - standart olanlar "geri" və "ev" dir. Bu halda, "geri" Referrer (və ya Referer) başlığında göstərilən URL-ə yönləndirir və "ev" "ev" parametrindən istifadə edir (defolt "/").

res.cookie(ad, val[, seçimlər])

Ad adlı kukinin dəyərini val olaraq təyin edir. Seçimlər: httpYalnız, təhlükəsiz, vaxtı bitir və s. Yol seçimi standart olaraq "ev" parametrində təyin edilmiş dəyərə uyğundur, adətən "/" .

// 15 dəqiqə ərzində "məni yadda saxla" res.cookie("xatırlayıram", "bəli", ( vaxtı bitir: yeni Tarix(Date.now() + 900000), httpOnly: true ));

maxAge xassəsi millisaniyələrdə Date.now() ilə müqayisədə müddəti bitəcək şəkildə təyin edilə bilər. Beləliklə, yuxarıdakı nümunəmizi indi belə yenidən yazmaq olar:

res.cookie("yadda saxla", "bəli", ( maxYaş: 900000 ));

Daxil olan kukiləri təhlil etmək üçün req.cookies obyektini yaradan cookieParser qatından istifadə edin:

app.use(express.cookieParser()); app.get("/", funksiya(req, res) ( // req.cookies.xatırla ));

res.clearCookie(ad[, seçimlər])

Biz ad adlı kukini təmizləyirik, bitmə müddəti parametrinə uzaq keçmişdə tarix təyin edirik. Seçimlər res.cookie() ilə eynidir, yol da defolt olaraq "ev" parametrinə verilir.

res.clearCookie("yadda saxla");

res.render(baxış[, seçimlər[, fn]])

Verilmiş seçimlər və əlavə fn geri zəngi ilə bir görünüş təqdim edir. fn verildikdə, müştəriyə cavab avtomatik deyil, əks halda mətn/html cavabı 200 kodu ilə edilir.

Keçirilmiş seçimlər də yerli görünüş dəyişənləridir. Məsələn, əgər istifadəçi dəyişənini ötürmək və layoutu söndürmək istəyiriksə, bunu bir obyektdə edirik:

var user = (ad: "tj" ); res.render("indeks", ( layout: false, user: user ));

Seçimlər obyekti də seçimləri ötürmək üçün istifadə olunur. Məsələn, status xassəsini keçirsəniz, o, nəinki görünüş üçün əlçatan olur, həm də cavabın status kodunu təyin edir. Şablon mühərriki sazlama və ya kompres kimi müəyyən variantları qəbul edərsə, bu da faydalıdır. Aşağıda səhv səhifəsini necə göstərə biləcəyiniz nümunəsidir - status həm onu ​​göstərmək, həm də res.statusCode status kodunu təyin etmək üçün buradan ötürülür.

res.render("xəta", ( status: 500, mesaj: "Daxili Server Xətası" ));

res.partial(baxın[, seçimlər])

Verilmiş variantlarla fraqmenti göstərir. Bu metod həmişə yerli dəyişən kimi görünüşdən əldə edilə bilər.

  • obyekt - görünüşə keçən obyekt
  • obyekt obyektini və ya görünüşə ötürülən kolleksiyanın hər bir elementini təmsil edəcək dəyişənin adı kimi. Defolt görünüşün adıdır.
    • kimi: "bir şey" - yerli dəyişən bir şey əlavə edəcək
    • kimi: bu - kolleksiya elementini baxış konteksti kimi istifadə edəcək (bu)
    • kimi: qlobal - kolleksiya elementinin xassələrini və yerli görünüş dəyişənlərini birləşdirəcək
    • kolleksiya - obyektlərin massivi. Onun adı mənzərənin adından gəlir. Məsələn, video.html daxilində video obyekti olacaq.

Aşağıdakı konstruksiyalar bir-birinə ekvivalentdir və fraqmentə ötürülən kolleksiya adı həmişə "film" olacaq.

qismən("theatre/movie.jade", (kolleksiya: filmlər )); qismən("theatre/movie.jade", filmlər); qismən("film.jade", (kolleksiya: filmlər )); qismən("film.yeşim", filmlər); qismən("film", filmlər); // Görünüşün içərisində: moovie.director

Yerli dəyişənin adını "film"dən "video"ya dəyişmək üçün as seçimindən istifadə edə bilərsiniz:

qismən("film", (toplama: filmlər, kimi: "video" )); // Görünüşün içərisində: video.director

Biz həmçinin filmi baxışımızda bu dəyəri edə bilərik ki, movie.director əvəzinə this.director-a müraciət edək.

qismən("film", (toplama: filmlər, kimi: bu )); // Görünüşün içərisində: bu.direktor

Alternativ həll, kolleksiya elementinin xassələrini psevdo-qlobal (əslində yerli) dəyişənlərə genişləndirməkdir: qlobal, sintaktik şəkər:

qismən("film", (kolleksiya: filmlər, kimi: qlobal )); // Görünüş daxilində: rejissor

Eyni məntiq təkcə kolleksiyalara deyil, həm də fraqment görünüşündəki obyektə də aiddir:

qismən("film", (obyekt: film, kimi: bu )); // Görünüşün içərisində: this.director partial("film", ( obyekt: film, kimi: qlobal )); // Görünüşün içərisində: rejissor qismən("film", ( obyekt: film, kimi: "video" )); // Görünüşün içərisində: video.director partal("film", ( obyekt: film )); // kino.rejissor

İkinci arqument qeyri-kolleksiya (.length olmadan) olduqda, o, obyekt kimi qəbul edilir. Bu halda görünüşün adından bu obyekt üçün lokal dəyişənin adı formalaşır.

var movie = new Movie("Nightmare Before Christmas", "Tim Burton") qismən("film", movie) // => Görünüş içərisində: movie.director

Bu qaydanın istisnası sadə obyekt ("()" və ya "yeni Obyekt") ötürüldükdə, o, lokal obyekt hesab olunur və fraqment görünüşündə adına görə əlçatan deyildir. Məsələn, aşağıdakı nümunədə yerli dəyişən "film" olmasını gözləyərdiniz, lakin bu sadə obyekt olduğundan, yerli dəyişənlər artıq "rejissor" və "title" dir, yəni onun xassələri:

var film = ( başlıq: "Miladdan əvvəl kabus", rejissor: "Tim Burton" ); qismən("film", film)

Belə hallar üçün sadə obyekti ötürmək lazım olduqda, sadəcə onu hansısa xassə təyin edin və ya obyektin adını fayl adından miras alacaq obyekt xassəsindən istifadə edin. Aşağıda sadalanan nümunələr ekvivalentdir:

qismən("film", ( yerli: ( film: film )) qismən("film", ( film: film )) qismən("film", ( obyekt: film ))

Eyni API marşrutdan istifadə oluna bilər ki, siz AJAX və ya WebSockets vasitəsilə HTML fraqmenti ilə cavab verə biləsiniz, məsələn, birbaşa marşrutdan istifadəçilər toplusunu göstərə bilərsiniz:

app.get("/users", function(req, res) ( if (req.xhr) ( // topludan hər bir istifadəçini cavab olaraq göndərmək // "istifadəçi" görünüşünə keçib res.partial("user", users) ; ) else ( // istifadəçi siyahısı səhifəsi ilə tam tərtibatla cavab verin // şablonu qismən("user", users) // edir və bir növ interfeys əlavə edir res.render("users", ( istifadəçilər: istifadəçilər ))) )))

res.local(ad[, val])

Müəyyən edilmiş yerli dəyişəni alın və ya təyin edin. Bu halda yerli dəyişənlər res.render() kimi görünüşün göstərilməsi metodlarına ötürülən dəyişənlərə aiddir.

app.all("/movie/:id", function(req, res, next) ( Movie.get(req.params.id, function(səhv, movie)) ( // Tapşırığı edir res.locals.movie = film res .local("film", film); )); )); app.get("/movie/:id", function(req, res) ( // yerli dəyişən film artıq mövcuddur // lakin lazım gələrsə onu əlavə edə bilərik res.render("film", ( displayReviews: true ) ); )))

res.locals(obj)

Verilmiş obj obyektindən istifadə edərək çoxlu yerli dəyişənlər təyin edin. Aşağıdakılar ekvivalentdir:

res.local("foo", bar); res.local("bar", baz); res.locals(( foo: bar, bar, baz ));

Server

app.set(ad[, val])

Tətbiq adı parametrini val olaraq təyin edin və ya val yoxdursa ad parametrinin dəyərini əldə edin:

app.set("baxışlar", __dirname + "/baxışlar"); app.set("baxışlar"); // => ...yol...

Siz həmçinin proqram parametrləri vasitəsilə parametrlərə daxil ola bilərsiniz:

app.settings.views // => ...yol...

app.enable(ad)

Ad parametrini doğru olaraq təyin edir:

app.enable("bəzi ixtiyari parametrlər"); app.set("bəzi ixtiyari parametrlər"); // => true app.enabled("bəzi ixtiyari parametr"); // => doğrudur

app.enabled(ad)

Ad parametrinin doğru olub olmadığını yoxlayır:

app.enabled("keşişə baxmaq"); // => false app.enable("keşe bax"); app.enabled("keşişə baxmaq"); // => doğrudur

app.disable(ad)

Ad parametrini yanlış olaraq təyin edin:

app.disable("bəzi parametrlər"); app.set("bəzi parametrlər"); // => false app.disabled("bəzi parametrlər"); // => yalan

app.disabled(ad)

Ad parametrinin yanlış olub olmadığını yoxlayır:

app.enable("keşi bax"); app.disabled("keşişə bax"); // => false app.disable("keşe bax"); app.disabled("keşişə bax"); // => doğrudur

app.configure(env|funksiya[, funksiya])

env mühiti (və ya bütün mühitlər üçün) üçün geri çağırış funksiyasını təyin edir:

app.configure(function() ( // bütün mühitlər üçün işləyir )); app.configure("inkişaf", function() ( // yalnız "inkişaf" mühiti üçün icra olunur));

app.redirect(ad, val)

Res.redirect() üçün qısa yolları (tətbiq sahəsində) aşağıdakı kimi təyin edə bilərik:

app.redirect("google", "http://google.com");

İndi marşrutda zəng edə bilərik:

res.redirect("google");

Siz həmçinin dinamik ixtisarlar edə bilərsiniz:

app.redirect("şərhlər", funksiya(req, res) ( "/post/" + req.params.id + "/şərhlər"; ) qaytarın);

İndi siz aşağıdakıları edə bilərsiniz və yönləndirmə sorğu kontekstinə uyğun olaraq dinamik şəkildə qurulacaq. Marşrutu GET /post/12 ilə çağırsaq, yönləndirməmiz /post/12/comments olacaq.

app.get("/post/:id", funksiya(req, res) ( res.redirect("şərhlər"); ));

Quraşdırılmış proqram halında, res.redirect() tətbiqin quraşdırma nöqtəsini nəzərə alacaq. Məsələn, bloq tətbiqi /blog-da quraşdırılıbsa, aşağıdakı nümunə /blog/posts-a yönləndiriləcək:

res.redirect("/posts");

app.error(funksiya)

Aşağıda göstərildiyi kimi, birinci parametri bütün istisnaları qəbul edəcək səhv idarəedici funksiyanı əlavə edir. Nəzərə alın ki, bu metodu bir neçə dəfə çağırmaqla bir neçə səhv idarəedicisini təyin etmək mümkündür, lakin metod istisnanın özünü idarə etmək istəmirsə, next() çağırmalıdır:

app.error(funksiya (səhv, tələb, res, növbəti) ( res.send(err.message, 500); ));

app.helpers(obj)

Statik görünüş köməkçilərini qeyd edir.

app.helpers(( ad: funksiya(birinci, sonuncu) ( ilk + ", " + sonuncunu qaytarın ), birinciAd: "tj", soyad: "holowaychuk" ));

Görünüşümüz indi firstName və LastName dəyişənlərindən və name() funksiyasından istifadə edə bilər.

<%= name(firstName, lastName) %>

Express həmçinin defolt olaraq bir neçə yerli dəyişən təmin edir:

  • parametrlər - proqram parametrləri obyekti
  • layout(yol) düzənliyi birbaşa görünüş daxilindən təyin edir

Bu metod app.locals() ləqəblidir.

app.dynamicHelpers(obj) (#app.dynamic-helpers)

Dinamik görünüş köməkçilərini qeyd edir. Dinamik görünüş köməkçiləri sadəcə olaraq res , req qəbul edən və hər hansı görünüşü göstərməzdən əvvəl Server instansiyasının kontekstində yerinə yetirilən funksiyalardır. Belə bir funksiyanın qaytarılması dəyəri funksiyanın əlaqəli olduğu yerli dəyişənə çevrilir.

app.dynamicHelpers(( sessiya: funksiya(req, res) ( req.session; ) ) );

İndi bütün baxışlarımızın sessiyaya girişi olacaq - sessiya məlumatları session.name və s. qaydasında mövcud olacaq:

<%= session.name %>

app.lookup

Verilmiş yol ilə əlaqəli marşrut idarəedicilərini qaytarır.

Tutaq ki, bu marşrutlar var:

Hansı marşrutların göstərildiyini yoxlamaq üçün axtarış funksiyasından istifadə edə bilərsiniz. Bu, Express üzərində qurulmuş daha yüksək səviyyəli çərçivələr üçün faydalı ola bilər.

app.lookup.get("/user/:id"); // => app.lookup.get("/user/:id/:op?"); // => app.lookup.put("/user/:id"); // => app.lookup.all("/user/:id"); // => app.lookup.all("/hey"); // =>

app.lookup.HTTP_METHOD() üçün ləqəb sadəcə olaraq app.HTTP_METHOD()-dur - geri çağırış arqumenti olmadan. Bu azalmadır. Məsələn, aşağıdakı ekvivalentdir:

app.lookup.get("/istifadəçi"); app.get("/istifadəçi");

Hər bir qaytarılmış funksiya faydalı xüsusiyyətlərlə tamamlanır:

var fn = app.get("/user/:id/:op?"); fn.regexp // => /^\/user\/(?:([^\/]+?))(?:\/([^\/]+?))?\/?$/i fn .keys // => ["id", "op"] fn.path // => "/user/:id/:op?" fn.method // => "GET"

app.match

Verilmiş URL-də işə salınan, sorğu sətrini və s. ehtiva edə bilən geri çağırış funksiyaları sırasını qaytarır. Bu, hansı marşrutların cavab vermək qabiliyyətinə malik olduğunu anlamaq üçün faydalı ola bilər.

Tutaq ki, bizdə aşağıdakı marşrutlar var:

app.get("/user/:id", function() ()); app.put("/user/:id", function() ()); app.get("/user/:id/:op?", function() ());

GET-də uyğunluğun çağırılması iki funksiyanı qaytaracaq, çünki sonuncu marşrutdakı :op isteğe bağlı parametrdir.

app.match.get("/user/1"); // =>

Növbəti zəng isə /user/:id/:op? üçün yalnız bir geri zəngi qaytaracaq? .

app.match.get("/user/23/edit"); // =>

HTTP metodu bizim üçün vacib deyilsə all() funksiyasından da istifadə edə bilərik

app.match.all("/user/20"); // =>

Hər bir funksiya aşağıdakı xüsusiyyətlərlə təchiz edilmişdir:

var fn = app.match.get("/user/23/edit"); fn.keys // => ["id", "op"] fn.params // => ( id: "23", əməliyyat: "edit" ) fn.method // => "GET"

app.mounted(fn)

Bu Server Server.use() -ə ötürüldükdə çağırılan fn-ə geri çağırış təyin edin.

var app = express.createServer(), blog = express.createServer(); blog.mounted(funksiya(valideyn) ( //valideyn proqramdır // bu blogdur )); app.use(blog);

app.register(daxili, ixrac)

Şablon mühərrikinin müəyyən edilmiş ixrac xassələrini (ixraclarını) şablon faylının əlavə genişlənməsi ilə əlaqələndirir.

app.register(".html", tələb ("jade"));

Bu, adı şablon fayl uzantısına tam uyğun gəlməyən kitabxanalar üçün də faydalı ola bilər. Canlı nümunə - Haml.js, quraşdırılıb npm-om "hamljs" kimi və biz onu defolt olaraq ".hamljs" əvəzinə ".haml" şablonları ilə qeyd edə bilərik:

app.register(".haml", require("haml-js"));

Bundan əlavə, app.register API-si Express spesifikasiyalarına uyğun olmayan şablon mühərrikləri üçün çox faydalıdır. Aşağıdakı nümunədə .md uzantısını rendererlə əlaqələndiririk işarələmə-fayllar. Biz HTML-də yalnız ilk dəfə - daha yaxşı performans üçün - göstərəcəyik və "(ad)" formasının dəyişən dəyişdirilməsini dəstəkləyəcəyik.

app.register(".md", ( tərtib: funksiya(str, seçimlər) ( var html = md.toHTML(str); qaytarma funksiyası(yerli) ( html.replace(/\(([^)]+ qaytarın) \)/g, funksiya(_, ad) ( yerliləri qaytarın; )); ); ) ));

app.listen()

Proqram server yuvasını host:port ünvanına bağlayırıq. Defolt port 3000, host INADDR_ANY-dir.

app.listen(); app.dinle(3000); app.listen(3000, "n.n.n.n");

Port arqumenti də yolu təmsil edən sətir ola bilər unix domen yuvası:

app.listen("/tmp/express.sock");

İndi cəhd edək:

$ telnet /tmp/express.sock GET / HTTP/1.1 HTTP/1.1 200 OK Məzmun növü: mətn/düz Məzmun uzunluğu: 11 Salam Dünya

Layihə iştirakçıları

Layihəyə əsas töhfə verənlər aşağıdakılardır:

  • TJ Holowaychuk (visionmedia)
  • Ciaran Jessup (ciaranj)
  • Aaron Heckmann (aheckmann)
  • Guillermo Rauch (guille)

Üçüncü tərəf modulları

Aşağıdakı modullar Express ilə işləyir və ya onun üzərində qurulur:

  • resurs marşrutunu təmin edir
  • pop-up bildirişləri göstərən ekspress mesajlar
  • asinxron konfiqurasiya üçün ekspress-konfiqurasiya dəstəyi (Redis-dən məlumatların yüklənməsi və s.)
  • express-namespace - marşrutlardakı ad boşluqları
  • express-expose sadəcə olaraq tətbiqin müştəri tərəfində JS kodunu dərc edir
  • express-params - app.param() uzantıları
  • express-mongoose - Mongoose sorğularının nəticələrini asanlıqla göstərmək üçün plagin (MongoDB üçün ORM)

Sintaksis nümunəsinə baxsaq, tətbiqə yeni marşrut əlavə etmək istəsək, sadəcə aşağıdakı kimi bir şey edə bilərik:

Router.get("/app", funksiya(req, res) ( res.render("app", ( başlıq: "Express" )); ));

Bu marşrutdur? Bu nəzarətçidir?

Ən maraqlısı odur ki, marşrut məntiqi ehtiva edən funksiyadır. Marşrutun içərisində res.render funksiyası var:

Res.render("foo", ( başlıq: "Express" ));

Görünüş şablonunda bunu görürük:

H1= başlıq p #(başlıq)-a xoş gəlmisiniz

Bunlar nəzarətçidən/marşrutdan məlumatları necə çıxara biləcəyimizə və onu görünüşdə göstərə biləcəyimizə dair iki nümunədir. Bu nümunədə HTML-ni çıxarırıq:

Ekspres

Express-ə xoş gəlmisiniz

Bütün bunlar problemdən qaynaqlanır - marşrutda nəzarətçi məlumatı da ola bilərmi? Bu doğrudur, buna görə də cəmiyyətdə qovluğun adını marşrutlardan nəzarətçilərə dəyişdirmək üçün bir hərəkət var.

Bunun gözəl nümunəsini Express MVC nümunəsində görmək olar.

Lakin ardıcıllıq naminə biz bu təlimatda mövcud konvensiyalara sadiq qalacağıq.

404 səhv

Artıq xətalar sizi Express-ə göndərir. app.js faylında aşağıdakılar var:

/// catch 404 və səhv idarəedicisinə yönləndirin app.use(function(req, res, next) ( var err = new Error("Tapılmadı"); err.status = 404; next(err); ));

Baxışlar/qovluqda errors.jade var.

Düzəliş blokunun məzmununu genişləndirir h1= mesaj h2= error.status pre #(error.stack)

Bu sadədir. 404 səhifənizi fərdiləşdirmək istəyirsinizsə, sadəcə bu görünüşü redaktə edin.

Node JS & Express əsasları (III).

Npm-nin nə olduğunu və nə üçün lazım olduğunu anlayaq. Express və EJS şablon mühərrikini quraşdırın. Biz bütün hazırlıq işləri görürük və NodeJS-də öz veb saytımızı yaratmağa başlayırıq.

İndi daim dəyişəcək parametrlərlə.

Müəyyən bir dəyərə istinad yaratmaq lazımdırsa, /mews/value . Bu dəyişəcək. Məsələn: 23, hissə və ya hər hansı digər dəyər.

App.get("/news/:id", function(req, res)( res.send("ID - " + req.params.id); ));

Bu parametrdən asılı olaraq verilənlər bazasından (verilənlər bazasından) məlumat götürə və konkret məqaləni göstərə bilərik.

Bizə müəyyən bir html faylına ehtiyacımız var, burada id-mizin məlumatlarını ötürəcəyik və bu məlumatlardan asılı olaraq bu və ya digər məlumatları göstərəcəyik.

Bizə bir az lazımdır şablon mühərriki.

Express sayəsində biz bir neçə şablon mühərrikindən istifadə edə bilərik.

EJS isteğe bağlı paket olduğundan onu quraşdırmalıyıq.

Enter düyməsini basın

Bundan sonra layihəmizdə quraşdırılacaq.

O, məlumatı müxtəlif şablonlara ötürməyə imkan verir və bu şablonlar .ejs genişlənməsinə malik olacaq.

Bu şablonlarda biz html kodumuzu ona daxil edilmiş js kodu ilə birlikdə göstərə biləcəyik (dəyişənlər, çıxış döngələri və daha çox).

Ona ötürülən məlumatlardan asılı olaraq dəyişəcək bir səhifə şablonu olacaq.

Etməli olduğumuz ilk şey hansı görünüş mühərrikindən istifadə edəcəyimizi müəyyən etməkdir.

Baxış mühərriki əslində şablon mühərrikidir.

Onların sayı çox olduğundan və biz EJS-ni seçdiyimiz üçün onu index.js faylımızda göstərməliyik.

Tətbiq dəyişənini işə saldıqdan dərhal sonra.

App.set("görüntü mühərriki", "ejs");

Göstərəcəyimiz bütün fayllar standart olaraq baxışlar qovluğunda axtarılacaq.

index.js ilə eyni səviyyədə bir baxış qovluğu yaradacağıq.

Orada biz yeni news.ejs faylı yaradacağıq. Bu dolduracağımız bir növ şablon olacaq.

Bu şablonlara ən çox yayılmış html kodunu yerləşdirə bilərik.

Xəbərlər

Xəbərlər səhifəsi.

Bunun üçün mənə .send və ya .sendFile metodundan istifadə etmək lazım deyil, amma mənə render() metodu lazım olacaq.

render() metodu istədiyiniz faylı (şablon) baxışlar qovluğuna götürür və onu brauzerdə göstərə bilər. Üstəlik, müəyyən parametrləri bu şablona ötürə bilər.

Genişləndirmə render() metodunda göstərilməyə bilər. Sonra, bəzi parametrləri şablonun özünə ötürə bilərsiniz. Ona görə də obyekti ikinci parametr kimi keçirik. O, çoxlu sayda xassələri və dəyərləri ehtiva edə bilər.

Deyək ki, newsId müəyyən parametrini req.params.id dəyəri ilə ötürməyə qərar verdik - yəni dəyər çağırılan id-nin özü olacaq.

App.get("/news/:id", function(req, res)( render("news", (newsId: req.params.id)); ));

Beləliklə, dəyər id dəyəri ilə newsId adlanacaq xəbər şablonuna ötürüləcək.

Biz bütün bunları news.ejs faylında qəbul edib göstərə bilərik.

news.ejs faylımızı bir az dəyişdirək. ID-ni səhifənin başlığında göstərəcəyik.

Hər şeyi EJS şablon mühərriki üçün sənədlərdə tapa bilərsiniz (yuxarıdakı link).

ID = ilə xəbər səhifəsi<%= newsId %>

Fayl /views/news.ejs

Xəbərlər

ID = ilə xəbər səhifəsi<%= newsId %>

Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eaque numquam libero, weniam ipsum similique odit molestiae esse quia blanditiis magni debitis aliquam, pariatur nam quaerat quas nemo, facilis temporibus workiosam. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Daha çox, memar, rəsmi olaraq, korrupsiyaya uğrayaraq, hər hansı bir həyat yoldaşı var. Ən böyük arzu edirəm, heç bir şey yoxdur!

index.js faylı

İcazə verin = tələb edin("express"); let app = express(); app.set("görüntü mühərriki", "ejs"); app.get("/", funksiya(req, res)( res.sendFile(__dirname + "/index.html"); )); app.get("/haqqında", funksiya(req, res)( res.sendFile(__dirname + "/haqqında.html"); )); app.get("/news/:id", function(req, res)( res.render("news", (newsId: req.params.id)); )); app.dinle(8080);

Çoxlu parametrləri ötürə bilərik. Misal üçün:

App.get("/news/:id", function(req, res)( res.render("news", (newsId: req.params.id, newParam: 535 )); ));

Və news.ejs faylında biz onu səhifədə göstərəcəyik, məsələn:

<%= newParam %>

Bundan əlavə, biz öz obyektlərimizi köçürə bilərik. Məsələn, bir obyekt yaradaq:

App.get("/news/:id", funksiya(req, res)( let obj = (başlıq:"Xəbərlər", id: 4); res.render("xəbər", (newsId: req.params.id, newParam: 535)); )))

Və biz də bu obyekti köçürə bilərik. Əvvəlcə nə ötürəcəyimizin adını müəyyənləşdiririk, sonra nə ötürəcəyimizi göstəririk.

Misal üçün:

App.get("/news/:id", function(req, res)( let obj = ( title:"News", id: 4); res.render("news", (newsId: req.params.id) , newParam: 535, obj: obj ))) ));

Başlıq =<%= obj.title %>

ID=<%= obj.id %>

<%= newParam %>

Massivin şablona ötürülməsi.

Gəlin verilənlər massivi yaradaq və onu döngədən istifadə edərək göstərək.

App.get("/news/:id", function(req, res)( let obj = ( başlıq:"Xəbərlər", id: 4, paraqraflar:["Paraqraf", "Adi mətn", "Nömrələr: 3, 7, 24", 476]); res.render("xəbər", (newsId: req.params.id, newParam: 535, obj: obj)); )))

İndi şablonun özündə biz sadəcə olaraq bu massivi dövrədə çıxaracağıq:

    <% obj.paragraphs.forEach(function(item) { %>
  • <%= item %>
  • <% }); %>

Statik fayllar və ara proqram.

Digər fayllara daxil edilə bilən fayllar.

İndi bir şablonumuz var - news.ejs, amma təsəvvür edin. ki, onların çoxu var. Onlarla. Və bütün bu fayllarda görünən kodun bəzi hissəsinə dəyişiklik etməli olacaqsınız. Çoxlu dəyişikliklər edilməli olacaq.

Bunun qarşısını almaq üçün digər fayllara daxil edilə bilən fayllardan istifadə edə bilərsiniz. Misal üçün. Saytın başlığı olan bir fayl var. Bir şeyi dəyişdirmək lazımdırsa, o zaman yalnız bir fayla dəyişiklik etmək kifayətdir, çünki o, sadəcə başqalarına qoşulur.

Görünüşlər şablonları qovluğunda bloklar adlı qovluq yaradın və orada hrader.ejs faylı.

Fayl hrader.ejs

  • Əsas üçün
  • Bizim haqqımızda
  • Xəbərlər

İndi bu faylı bütün şablonlara daxil etməliyik. Xəbər faylına gedin və açılış mətn etiketindən dərhal sonra yazın:

<% include blocks/header.ejs %>

Şablon mühərriki həmişə orada axtarışa başladığı üçün yol görünüşlər qovluğundan müəyyən edilir.

Statik fayllar.

Gəlin index.js səviyyəsində ictimai adlı yeni qovluq yaradaq. Bütün statik faylları ehtiva edəcəkdir. Bunlar css faylları, şəkillər, sənədlər və s. Bütün bu fayllar. saytımızın müxtəlif səhifələrindən çağırılacaq.

Bu qovluqda biz başqa bir qovluq yaradacağıq - css və orada biz style.css faylı yaradacağıq.

index.ejs faylından bütün stil kodunu ona köçürəcəyik

.ejs fayllarına üslubları daxil edirik:

İndi yoxlasanız, heç nə olmayacaq. Üslublar birləşdirilməyəcək.

Statik faylları daxil etmək üçün ara proqramdan istifadə etməliyik:

Yuxarıdakı index.js faylında app.set-dən dərhal sonra yazmalıyıq:

App.use("/public",);

İndi /public ilə başlayan bir keçiddən istifadə etsək, NodeJS və Express özü nədən istifadə etdiyimizi başa düşəcək statik fayllar və hər şey düzgün bağlanacaq.

İkincisi, biz onları express.static("public"), yəni /public qovluğunda axtardığımız yerdir.

Xülasə etmək üçün app.use("/public", express.static("public")) kodunda; yazdığımız linki izləyirik

Əgər belə olsaydı:

Sonra bu kodda belə olardı:

App.use("/assets", express.static("public"));

Bu halda, ictimai bir qovluğa işarə edir!

Bu şəkildə buraxsanız, heç bir dəyişiklik olmayacaq. Fayl bağlanacaq, çünki biz aktivlər linkini izləyəcəyik.

App.use("/assets ", express.static("public"));

Çaşqınlığın qarşısını almaq üçün adətən eyniadlı keçid və qovluq düzəldirlər. Çox vaxt bu ictimai xarakter daşıyır.

Orta proqram hər hansı bir məlumatı səhifəyə (serverə) göndərməzdən əvvəl etdiyimiz işdir.

Bu halda, bu, bizim ara proqramdır.

HTML formasının yaradılması və məlumatların alınması

Bizim edəcəyimiz ilk iş formanın özünü saytımıza əlavə etməkdir.

about.ejs faylını açın və burada bootstrap texnologiyasından istifadə edərək forma əlavə edəcəyik.

Axtarış pəncərəsinə Formaları daxil edin və tapılan səhifənin yuxarı hissəsindən birinci formanı kopyalayın.

Saxlayaq və qaçaq.

POST sorğusu.

POST sorğusunu yerinə yetirəcəyimiz üçün forma bir neçə atribut əlavə etməliyik.

Method="post" - çünki POST sorğusu

Və action="" istifadəçi "Göndər" düyməsini kliklədikdən sonra onu yönləndirməli olduğunuz yerdir. Bizim vəziyyətimizdə belədir:

Biz index.js faylında qalan hər şeyi etməliyik

İlk öncə body-parser adlı paketi endirməliyik.

Bu, bizə formadan gələn POST sorğusunu götürməyə və onu emal etməyə imkan verir. Başqa sözlə, bütün məlumatları formadan əldə edin.

Quraşdırmaq üçün CS-də layihə qovluğuna yazın.

npm bədən analizini quraşdırın

Basın - Enter.

Paket quraşdırılıb.

Quraşdırıldıqdan sonra sadə təlimatlara əməl etməlisiniz.

Veb saytındakı Nümunələr bölməsinə keçək və orada Ekspress marşruta aid bölməni tapaq

  1. Bizə lazım olan modulları birləşdiririk.
  2. Var bodyParser = tələb edir ("bədən-parser")

    Var urlencodedParser = bodyParser.urlencoded(( uzadılmış: false ))

    Yəni, POST sorğusundan məlumat götürməyə və ehtiyacımız olan kimi onunla işləməyə imkan verəcək analizator.

  3. Bundan əlavə, sənədlərə əsasən, biz POST sorğusunu izləməli və ona bəzi ara proqram (urlencodedParser) ötürməli olduğumuzu görürük. Biz artıq GET sorğularını əvvəllər izləmişik.

Formadan alınan məlumatları konsola çıxaracağıq.

Console.log(req.body);

Siz dərhal çek əlavə edə bilərsiniz. Heç bir forma məlumatı təqdim edilmədikdə, sadəcə olaraq xəta verəcəyik.

Əgər (!req.body) res.sendStatus(400) qaytararsa

Formanın özündə siz sahələr üçün ad atributunu təyin etməlisiniz. Bunlar xassələrin adları olacaq və dəyər istifadəçinin daxil etdiyi şey olacaq.

Bizim haqqımızda. <% include blocks/header.ejs %>

İkinci səviyyəli başlıq.

Əsas üçün

üçüncü səviyyəli başlıq.

Bu problemlərin əhəmiyyəti o qədər göz qabağındadır ki, fəalların geniş dairəsi ilə məsləhətləşmələr bizə kütləvi iştirakçılıq sistemlərinin inkişafında mühüm vəzifələri yerinə yetirməyə imkan verir. Daha yüksək dərəcəli ideoloji mülahizələr, habelə kadr hazırlığının həcmi və yeri aktual tələblərə cavab verən kadr hazırlığı sisteminin əhəmiyyətini qiymətləndirməyə imkan verir. Bununla belə, unutmaq olmaz ki, geniş çeşidli aktivlərlə məsləhətləşmələr təcili ehtiyaclara cavab verən kadr hazırlığı sisteminin hazırlanmasına və həyata keçirilməsinə kömək edir.

Bununla belə, unutmaq olmaz ki, geniş çeşidli aktivlərlə məsləhətləşmələr təcili ehtiyaclara cavab verən kadr hazırlığı sisteminin hazırlanmasına və həyata keçirilməsinə kömək edir.

E-poçtunuzu heç vaxt başqası ilə paylaşmayacağıq.

İcazə verin = tələb edin("express"); var bodyParser = require("body-parser"); let app = express(); var urlencodedParser = bodyParser.urlencoded(( uzadılmış: false )); app.set("görüntü mühərriki", "ejs"); app.use("/public", express.static("public")); app.get("/", funksiya(req, res)( res.render("indeks"); )); app.get("/haqqında", funksiya(tələb, res)( res.render("haqqında"); )); app.post("/haqqında", urlencodedParser, funksiya(req, res)( əgər (!req.body) qaytarır res.sendStatus(400); console.log(req.body); res.render("haqqında") ;))) app.get("/news", function(req, res) ( res.render("news-common",(newParam1:"Param-1")); )); app.get("/news/:id", function(req, res)( let obj = ( başlıq:"Xəbərlər", id: 4, paraqraflar:["Paraqraf", "Adi mətn", "Nömrələr: 3, 7, 24", 476]); res.render("news", (newsId: req.params.id, newParam: 535, obj: obj)); )); app.dinle(8080);

Məlumatları daxil edin və göndər klikləyin. Konsolda bu məlumatların çıxışını görəcəyik (mülkiyyət - dəyər).

Formanı təqdim etdikdən sonra səhifə yenidən yüklənəcək və konsolda göndərilən məlumatları görəcəyik.

İndi biz bunu edə bilərik ki, göndərdikdən sonra digər məlumatları göstərək.

index.js faylında kiçik kodu dəyişdirək

App.post("/haqqında", urlencodedParser, funksiya(req, res)( əgər (!req.body) qaytarır res.sendStatus(400); console.log(req.body); res.render(" haqqında-uğur", (məlumat: req.body)); });

Bu yolla about-success.ejs səhifəsini çıxaracağıq və indi onu baxışlar qovluğunda yaradacağıq. İkinci parametr olaraq biz forma məlumatlarını obyekt kimi ötürəcəyik. - (məlumat: req.body)

Bizim haqqımızda. <% include blocks/header.ejs %>

Salam, bu mənim Node.js-də ilk səhifəmdir

İkinci səviyyəli başlıq.

Əsas üçün

Eynilə, strukturun gücləndirilməsi və inkişafı təcili ehtiyaclara cavab verən kadr hazırlığı sisteminin hazırlanmasına və həyata keçirilməsinə kömək edir. Eynilə, mövqe formalaşdırmaq üçün gündəlik işin başlanğıcı bizdən əhəmiyyətli maliyyə və inzibati şərtləri təhlil etməyi tələb edir.

Çox sağ ol

E-poçt: <%= data.email %>
Keçmək: <%= data.pass %>
isCheck: <%= data.check %>

Bu yolla siz formalardan gələn məlumatları izləyə, onların uyğunluğunu yoxlaya və istifadəçi nəyisə doldurmayıbsa, xəta verə və s.

Bundan əlavə, bu məlumatları elektron poçtla göndərmək və ya verilənlər bazasında saxlamaq rahat olardı.

Onları poçtla göndərmək istəyirsinizsə. onda npm-də başqa bir paket var - Nodemailer. Bu paket məlumatı birbaşa e-poçta göndərməyə imkan verir. İstifadəsi asandır. Və onun köməyi ilə istifadəçi tərəfindən doldurulmuş formanın bütün məlumatlarını poçtla ala bilərsiniz.

NodeJS bizə bir çox əlavə paketlər təqdim edir. Məsələn, bağlantıları izləməyi və şablon mühərriklərindən istifadə etməyi asanlaşdırmaq üçün Express-dən istifadə etdik. Formadan alınan məlumatları qəbul etmək üçün bədən analizi. Nodemailer - məlumatların elektron poçtla göndərilməsi üçün.

URL sətirindən məlumatları necə əldə etmək olar.

Bəzən ünvan çubuğundan bu tip məlumatları əldə etməlisiniz:

http://localhost:8080/news/12?filter-id&city=london

Gəlin index.js faylından bu kodun nümunəsindən istifadə edərək bu məlumatı necə əldə edəcəyimizə baxaq:

App.get("/news/:id", function(req, res)( let obj = ( başlıq:"Xəbərlər", id: 4, paraqraflar:["Paraqraf", "Adi mətn", "Nömrələr: 3, 7, 24", 476]); res.render("news", (newsId: req.params.id, newParam: 535, obj: obj)); ));

Sadəcə olaraq bu məlumatları konsola çıxaraq:

App.get("/news/:id", function(req, res)( let obj = ( başlıq:"Xəbərlər", id: 4, paraqraflar:["Paraqraf", "Adi mətn", "Nömrələr: 3, 7, 24", 476]); console.log(req.query); res.render("news", (newsId: req.params.id, newParam: 535, obj: obj)); ));

Konsolda biz görəcəyik

(filtr: "id", şəhər: "london")

Bu bəzən faydalı ola bilər.

Bu məqalə başlanğıc tərtibatçılar və Node js Express ilə işləməkdə maraqlı olan hər kəs üçün nəzərdə tutulub. Bunu mənimsəmək üçün JavaScript-in əsaslarını bilməlisiniz:

Node.js nədir?

Node.js Chrome-un V8 JavaScript mühərrikinə əsaslanan asinxron JavaScript işləmə vaxtıdır. Genişləndirilə bilən şəbəkə proqramları yaratmaq üçün nəzərdə tutulmuşdur.

Node.js server tərəfində JavaScript kodu yazmağa imkan verir. İndi necə deyərsiniz? JavaScript brauzerdə işləyən bir dildir. Brauzer JavaScript kodunu qəbul edir və onu əmrlər şəklində tərtib edir. Node.js-in yaradıcısı Chrome mühərrikini götürdü və iş vaxtı qurdu ( icra müddəti) serverdə işləməsi üçün. Bu dilin təfsir oluna biləcəyi mühitdir. Bəs indi nəyimiz var? Backenddə JavaScript yazmağın bir yolu.

Tərifə gəldikdə, bu kontekstdə "asinxron" termininin nə demək olduğunu maraqlandıra bilərsiniz. JavaScript tək yivli dildir. Buna görə də, hadisələrin icranın əsas xəttini kəsməsini istəmirsiniz. Bu, əsas mövzunu kəsmədən hadisələrin işlənməsi deməkdir.

Node.js bu bloklanmayan dizayna əsaslanır və onu veb proqramlar yaratmaq üçün ən sürətli alətlərdən birinə çevirir. Aşağıdakı "Salam Dünya" nümunəsində bir çox əlaqə eyni vaxtda işlənə bilər. Hər bir əlaqə geri çağırışa səbəb olur.

Bu Node js Express nümunəsi altı sadə addımdan ibarətdir.

  1. Platformanız üçün Node.js quraşdırın (MacOS, Windows və ya Linux)

Node.js

Node.js® Chrome üçün V8 JavaScript mühərrikində quraşdırılmış JavaScript işləmə vaxtıdır. Node.js hadisəyə əsaslanan, bloklanmayan I/O istifadə edir...

İlk addım yerli maşınınızda JavaScript nümunəsini əldə etməkdir. Brauzerinizin ünvan çubuğuna nodejs.org yazın və ya linkə klikləyin və işiniz bitdi. Başlatma pəncərəsi sizə istədiyinizi dərhal verməlidir. Mən Ubuntu-nu kompüterimdə işə saldığım zaman əməliyyat sistemim üçün uyğun Node.js versiyası göstərilir. Yükləyin və quraşdırın. Bu, serveri yerli kompüterinizdə işə salmaq üçün sizə lazım olan alətlərlə təmin edəcək:

  1. Komanda satırını açın və yazın

mkdir myapp cd myapp

Bu Node js Express Post əmrləri istənilən əməliyyat sistemi üçün universaldır. Birincisi, hazırda olduğunuz kataloq daxilində yeni bir kataloq yaradacaq, mkdir = "kataloq yaratmaq" . Sonuncu bu yeni yaradılmış qovluğa dəyişəcək, cd = "kataloqu dəyişdir" .

  1. Layihənizi işə salın və npm ilə əlaqələndirin

Myapp adlı qovluq yaratdıqdan sonra siz layihəni işə salmalı və onu npm ilə əlaqələndirməlisiniz.

Npm node paket meneceri üçün qısadır ( Node paket meneceri). Bu, bütün Node paketlərinin yerləşdiyi yerdir. Onlar kod paketləri, müəyyən funksiyanı yerinə yetirən modullar kimi düşünülə bilər. Biz bu modullar tərəfindən təmin edilən tətbiq proqram interfeysindən, API-dən istifadə edirik.

Modullar, öz növbəsində, istənilən nəticəni əldə etmək üçün itələnə və çəkilə bilən düymələri və rıçaqları olan qara qutular kimi fəaliyyət göstərir. Aşağıdakı əmrin icrası layihənizi işə salır:

O, myapp qovluğunda package.json faylı yaradır. Faylda layihəyə yüklənmiş bütün npm paketlərinə keçidlər var.

Əmr sizdən fəaliyyət üçün bir neçə variant daxil etməyi təklif edəcək. Yolunuza bunlardan başqa hamısından keçə bilərsiniz:

giriş nöqtəsi: (index.js)

Bunu dəyişdirmək istəyəcəksiniz:

  1. Myapp qovluğuna Express quraşdırın

Express veb üçün möhkəm funksiyalar dəstini təmin edən minimal və çevik Node.js veb proqram çərçivəsidir.

Myapp qovluğunda olarkən, çalıştırın:

npm install express --save

Quraşdırma əmri quraşdırmaq üçün Node js Express fayl paketini axtarmağa davam edəcək. Onu layihənizdə quraşdırın.

İndi layihənizin kökündə node_modules qovluğu yaradılır. -save əlavə etmək paketi myapp qovluğunda package.json-da yerləşən asılılıq siyahısında saxlamağa imkan verir.

Express veb proqram yaratmaq və işə salmaq üçün alətlər dəsti təqdim edir. Express o qədər populyarlaşıb ki, indi Node.js proqramlarının böyük əksəriyyətində standartdır. Express istifadə etməyi çox tövsiyə edirəm.

  1. Mətn redaktorunu işə salın və app.js adlı fayl yaradın

Express Node-u quraşdırdıqdan sonra yaradılmış fayla aşağıdakı kodu əlavə edin:

var express = tələb ("express"); var app = express(); app.get("/", funksiya (req, res) ( res.send("Salam Dünya!"); )); app.listen(3000, funksiya () ( console.log("3000 portunda dinləyən proqram nümunəsi!"); ));

Burada yaxınlarda quraşdırılmış paketdən istifadə etməlisiniz. Birinci sətir node_modules qovluğunda yerləşən ekspress modulu ehtiva edən dəyişəni elan edir.

Modul bir funksiyadır. Funksiya çağırışının başqa dəyişənə təyin edilməsi gələcək işi asanlaşdıran əvvəlcədən təyin edilmiş alətlər dəstinə girişi təmin edir. Müvəqqəti tətbiqi, faktiki proqramı yaratmaq üçün metodlarından istifadə etdiyiniz obyekt kimi düşünə bilərsiniz.

Dinləmə metodu serveri işə salır və bağlantılar üçün 3000 portunu dinləyir. O cavab verir: “Salam Dünya! kök URL-ə GET sorğuları üçün (/). Hər hansı digər yol üçün o, 404 Tapılmadı ilə cavab verəcək.

  1. Tətbiqi işə salın

Komandanı daxil edin:

Komandanı işə saldıqdan sonra nəticəni görmək üçün brauzerinizə http://localhost:3000/ daxil edin. Siz də baxmalısınız" 3000 portunda dinləyən proqram nümunəsi».