Сайн байна уу? NodeJS ийн модуль систем, routing хийх талаар жаахан юм бичлээ.
Модуль Систем /олон js файл функц ууд хоорондоо харилцах/ Дан ганц .js файл д бүх кодоо чихээд байлтай биш хувааж үзье. Application бүтэц дараах байдлаар /жишээ/ -server.js -router.js -app.js //серверийн эхлэл
require() функц ийг http server жишээ нь дээр харсан байх. Энэ функц нь NodeJS ийн Модуль Системийн нэг функц бөгөөд эхний parameter дэх js файлыг уншаад тухайн javascript ийн exports гэсэн object ийг буцаадаг. exports гэх object нь Module System ээс цаанаасаа үүсгэгддэг. Ойлгомжгүй байвал дараах жишээнээс Тодорхой болох байх.
//файл: app.js
var rectangular = require('./rect'); //rect.js ийг уншина ./ гэдэг нь одоогийн байгаа directory гэсэн үг.
console.log(rectangular.values.a);
console.log(rectangular.values.b);
console.log(rectangular.values.a * rectangular.values.b);
//файл: rect.js
var values = { //Жишээ болгох json дата; тэгш өнцөгтийн урт өргөн хоёр
a: 300,
b: 400
}
exports.values = values; //app.js дотор require функц ээр дуудахад одоо энэ values гэсэн json data буцаагдах нь
Цаашлаад ийм байсан ч болно.
//файл: app.js
var rectangular = require('./rect');
console.log(rectangular.area(30 * 20));
//файл: rect.js
var area = function(a, b){
return a * b;
}
exports.area = area;
За модуль систем нь яаж ажиллаж байгаа нь ойлгомжтой бол нөгөө энгийн http server ээ хувааж үзье.
Routing - ямар хандалт өгсөнөөр нь ялгаж ямар хариу өгөх вэ гэдгийг чиглүүлэх Мэдээж ямар хандалт өгсөн талаарх мэдээл http ийн request обьект д байгаа.
http://localhost:8888/start?foo=bar гэж хандалт өгвөл request.url нь /start?foo=bar
гэсэн string буцаана.
Үүнийг задлахын тулд NodeJS ийн url модуль ийн parse функц хэрэг болно. Харин foo=bar&hello=world
гэсэн
датаг задлахад querystring модуль ийн parse() хэрэглэгдэнэ. Ингээд салгаад авчихвал route хийхэд бэлэн
боллоо.
url.parse(string).query
|
url.parse(string).pathname |
| |
| |
------ -------------------
http://localhost:8888/start?foo=bar&hello=world
--- -----
| |
| |
querystring(string)["foo"] |
|
querystring(string)["hello"]
Нэг string ийн хэдэн үйлдэл гүйцэтгэх web application бэлдсэн байгаа. Энэ дээр тэгээд тайлбарлаад явъя.
//файл: app.js
var server = require('./server');
var router = require('./router');
server.start(router); //server.js дотор start гэх функ байгаа бөгөөд үүнийг дуудсанаар сервер
//ачааллаж эхэлнэ. Манай серверт маань router хэрэгтэй учир router ийг
//дамжууллаа.
//end of app.js
//файл: server.js
var http = require('http');
var url = require('url'); //нөгөө яриад байсан 2 модуль
var querystring = require('querystring'); //нөгөө яриад байсан 2 модуль
var start = function(router){
http.createServer(function(request, response){
var parsedUrl = url.parse(request.url); //url ийн parse function яана гэлээ??
var pathname = parsedUrl.pathname; //parse хийгдсэн url дотор pathname гэж байгаа.
//үзмээр байвал console.log(parsedUrl);
var params = querystring.parse(parsedUrl.query); //query д нь нөгөө Get дата ууд байгаа
//foo=bar&hello=world гэх хэлбэрт. Querystring.parse() нь
//задлаад params.foo, params.hello гэж хандаж болохоор JSON
//дата болгоод өгнө.
console.log('Request: ' + pathname);
var done = function(value){ //router ажлаа хийж дуусахаар дуудагдах callback функц
response.writeHead(200, {'Content-Type':'text/html'}); //router нь зохих string үйлдлийг
//хийгээд буцаана. Тэр утга нь эхний param
//болох value болно.
response.write('<h1>' + value + '</h1>');
response.end();
}
router.process(pathname, params, done); //router ийн гол ажиллах process гэх функц байгаа
}).listen(8888);
console.log('Server has started! Listening on port 8888');
}
exports.start = start; //Ингэснээр app.js дотор сервер ийг start() функц ээр дуудаж ажилуулах боломжтой
//боллоо
//end of server.js
//файл: router.js
var operations = { //нэг ийм dummy model бичээд бэлдчихье. operations['/split']('namaig huvaa')
//гэвэл n,a,m,a,i,g,h,u,v,a,a гэж буцаах гэх мэт.
'/reverse': function(txt){
return txt.split("").reverse().join("");
},
'/split': function(txt){
return txt.split("").join();
},
'/say': function(txt){
return txt;
},
'/uppercase': function(txt){
return txt.toUpperCase();
}
}
//router функц д дамжигдах parameter үүд ойлгомжтой биз.
//тэр goback нь callback функц.
var router = function( pathname, params, goback){
console.log('Routing to ' + pathname);
//operations д байгаа үйлдлүүдээс гадуур юм ороод ирвэл
//яах вэ гээд шалгаж байна.
if(typeof(operations[pathname]) == 'undefined'){
goback(pathname + ' baihgui ee');
return 0;
}
//хэрвээ мөн бол бас txt гэсэн parameter өгсөн үгүйг мэдье.
if(! params.txt ){
goback('txt parameter is missing');
}
//шалгаад дууссан бол process хийгээд буцаая.
//манайхаар pathname / зам / нь үйлдэл ийн нэр байгааг анзаарсан байх
goback(operations[pathname](params.txt));
}
exports.process = router; //router функц ээ process гээд экспорт хийчихье.
Одоо сервер ээ асаагаад шалгаж үзвэл -http://localhost:8888/say?txt=mongolia mongolia -http://localhost:8888/reverse?txt=mongolia ailognom -http://localhost:8888/uppercase?txt=mongolia MONGOLIA -http://localhost:8888/split?txt=mongolia m,o,n,g,o,l,i,a
Энгийн routing нэг иймэрхүү. Advanced routing ийг тэгээд өөрөө regex ашиглаад хийчих байлгүй дээ тэ? :) Дараагынхаар юу бичих үү?
-Express JS MVC framework /Энгийн realtime блог хийх/ -Socket.io /Олон өрөөтөй чат хийх/ -Mongoose Object Modelling /MongoDB тэй ажиллаж үзэх/
-KnockoutJS ийг хамааруулна яваандаа.
Эхлэн сурж байгаа хүмүүсд их гоё хичээл байна аа MongoDB -тэй ажиллах хичээлээ хийгээд өгөөч тэгэхүү? Амжилт