You are on page 1of 42

B GIAO DUC VA AO TAO TRNG AI HC KHOA HC KHOA CNG NGH THNG TIN

BAI TIU LUN

MN : LP TRNH MANG

Ti : Tm hiu v node.js

Gio vin hng dn : Nguyn Quang Hng

Sinh vin thc hin : Nguyn Quang H

I. Gii thiu. ..........................................................................................................................3 1. Lp trnh khng ng b ................................................................................................3 2. Bn phi lm tt c ........................................................................................................3 3. Module ..........................................................................................................................5 4. Global Scope .................................................................................................................6 5. Cng ng .....................................................................................................................6 II. Installation ........................................................................................................................6 1. Installing Node.js . .........................................................................................................6 2. Installing New Modules .................................................................................................7 III. Cc objects c bn. ..........................................................................................................7 1. Global Objects (i tng ton cc)...............................................................................7 a. Console ......................................................................................................................7 b. Process ......................................................................................................................9 c. Buffers ..................................................................................................................... 13 2. S kin (Event). ........................................................................................................... 16 a. EventEmitter ................................................................................................................ 16 b. K tha t EventEmitter ( Inheriting From EventEmitter ). .......................................... 16 c. Loi b cc s kin lng nghe (Removing Event Listeners). ......................................... 17 3. Lung ( Streams ). ....................................................................................................... 17 a. Readable Streams......................................................................................................... 18 b. Writable Stream. .......................................................................................................... 20 4. File System .................................................................................................................. 21 a. Lm vic vi tp tin h thng. .................................................................................. 21 b. File thng tin ........................................................................................................... 22 c. Xem cc tp tin. ....................................................................................................... 22 5. HTTP. ......................................................................................................................... 23 a. Class: http.Server. .................................................................................................... 24 b. Class: http.ServerRequest. ....................................................................................... 24 c. Class: http.ServerResponse. ..................................................................................... 26 d. http.ClientResponse. ................................................................................................ 28 6. c thm Nodejs Docs. ............................................................................................... 29 IV. Cc ng dng c xy dng trn nn Node.js. ............................................................. 29 1. ng dng u tin. ...................................................................................................... 29 2. HTTP Server. .............................................................................................................. 29 3. X l cc tham s URL ............................................................................................... 31 4. c v vit file ............................................................................................................ 32 5. Nodejs vi mysql ......................................................................................................... 33 V. WebSocket vi Node.js v Socket.IO ............................................................................. 35 1. Tm hiu v Socket.IO ................................................................................................. 35 2. ng dng tnh kt qu biu thc cho trc. ................................................................. 36 3. ng dng webchat. ...................................................................................................... 38 a. Xy dng mt webchat server c bn. ...................................................................... 38 b. To module Server-Side chat socket. ....................................................................... 39 c. Khi to kt ni trn Client ...................................................................................... 40

TM HIU V NODE.JS I. Gii thiu. Node.js l mt h thng phn mm c thit k vit cc ng dng internet c kh nng m rng, c bit l my ch web. Chng trnh c vit bng JavaScript, s dng k tht iu khn theo s kin, nhp/xut khng ng b ti tiu tng chi ph v ti i kh nng m rng. Node.js bao gm c V8 JavaScript engine ca Google, libUV, v vi th vin khc. Node.js c to bi Ryan Dahl t nm 2009, v pht trin di s bo tr ca Joyent. Mc tiu ban u ca Dahl l lm cho trang web c kh nng push nh trong mt s ng dng web nh Gmail. Sau khi th vi vi ngn ng Dahl chn Javascript v mt API Nhp/Xut khng y . iu ny cho php anh c th nh ngha mt quy c Nhp/Xut iu khin theo s kin, non-blocking. Vi mi trng tng t c vit trong cc ngn ng khc bao gm Twisted cho Python, Perl Object Environment cho Perl, libevent cho C v EventMachine cho Ruby. Khc vi hu ht cc chng trnh Javascript, Nodejs khng chy trn mt trnh duyt m chy trn Server. Node.js s dng nhiu chi tit k thut ca CommonJS. N cung cp mt mi trng REPL cho kim th tng tc. Node.js c InfoWorld bnh chn l Cng ngh ca nm nm 2012. bt u dng Node.js, bn phi hiu s khc nhau gia Node.js vi cc mi trng truyn thng chy trn server (server side) ph bin nh PHP, Python, Ruby, etc 1. Lp trnh khng ng b L li th nu bn quen thuc vi cc phng php lp trnh khng ng b. Tt c cc hm trong Node.js l khng ng b. Do , tt c chy nh cc block thread thng thng thay v chy nn. y l iu quan trng nht nh v Node.js. V d, nu bn ang c mt tp tin trn h thng tp tin, bn phi ch nh mt chc nng gi li l thc hin khi hon thnh cc hot ng c. 2. Bn phi lm tt c Node.js ch l mi trng iu c ngha l bn phi t lm tt c. khng phi l mt server http ngm nh hoc l bt c server no khc. iu ny c th l hi kh hiu vi ngi mi, nhng thnh cng thc s ca n l a li mt hiu nng ng kinh ngc . Mt scrits c th iu phi mi kt ni vi cc client. iu ny lm s dng t ti nguyn a n mt hiu qu rt cao. V d sau v mt ng dng Node.js

var i, a, b, c, max; max = 1000000000; var d = Date.now(); for (i = 0; i < max; i++) { a = 1234 + 5678 + i; b = 1234 * 5678 + i; c = 1234 / 2 + i; } console.log(Date.now() - d);

V y l tng ng vi m PHP:
$a = null; $b = null; $c = null; $i = null; $max = 1000000000; $start = microtime(true); for ($i = 0; $i < $max; $i++) { $a = 1234 + 5678 + $i; $b = 1234 * 5678 + $i; $c = 1234 / 2 + $i; } var_dump(microtime(true) - $start);

V gi ta xem chm im benchmark cho hai on code trn khi chy trn hai mi trng khc nhau: Number of iterations 100 10000

Node.js 2.00 3.00

PHP 0.14 10.53

1000000 10000000 1000000000

15.00 143.00 11118.00

1119.24 10621.46 1036272.19

Ti thc hin chy hai on code trn t command line (console command) nn khng c tr thao tc thc thi. Ti chy tng th nghim 10 ln v ly kt qu trung bnh. PHP nhanh hn trong cc ln chy vi s lng nh vng lp. Nhng vn thay i khi s lng vng lp tng ln, s ln x l tng ln th PHP chy chm hn rt nhiu trong khi Node.js c tc ng kinh ngc. Sau tt c thao tc, PHP chm hn 93% so vi Node.js. 3. Module Node.js s dng mt kin trc m-un n gin ha vic to ra cc ng dng phc tp. M-un ging nh cc th vin trong C, hoc cc n v trong Pascal. Mi module c cha mt tp hp cc chc nng lin quan n "i tng" ca cc m -un. V d, cc m-un http cha cc chc nng c th cho HTTP. Node.js cung cp mt vi m-un c bn gip bn truy cp cc tp tin trn h thng tp tin, to ra trnh iu khin server HTTP v TCP / UDP v thc hin cc chc nng hu ch khc. gi mt modul tht d dng, ch cn gi hm require() nh sau
Var http = require(http);

Hm require() tr v tham chiu n cc module quy nh. Trong trng hp ca m ny, mt tham chiu n cc module http c lu tr trong bin http. Trong on code trn, ta truyn tn ca module vo trong hm require(). Vic ny ch nh cho Node.js tm trong th mc node_modules module tng ng thc hin. Nu Node khng thy module tng ng trong th mc th n s tm trn global module cache. Bn cng c th ch nh mt module qua mt file vt l qua ng dn tng i hay tuyt i nh sau:
var myModule = require('./myModule.js');

Module c ng gi tng phn m. on m nm trong mt m -un ch yu l private - c ngha l cc chc nng v bin c nh ngha trong h ch c th truy cp t bn trong ca cc m-un. Tuy nhin, bn c th tip xc vi chc nng v / hoc cc bin c s dng t bn ngoi ca m-un. lm nh vy, phi s dng cc i tng export vi cc thuc tnh v phng thc ca n vi tng phn m m bn mun gi t bn ngoi. Hy xem xt cc modul v d sau y:

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

Trong v d ny PI l bin private v ch c s dng bn trong on m, trong c hai hm area() v circumference() c t kha exports ch nh th s c th truy cp c t bn ngoi. 4. Global Scope Node l mt mi trng chy javascrip vi google V8 engine do h tr chy c server side. Do bn cng nn tun th cc kinh nghim m bn c trong lp trnh vi cc ng dng client -side. V d khi to cc bin global trong Node khng phi lc no cng c th to. Nhng bn c th to d dng cc bin hoc hm global vi cch b t kha var trc cc bin nh sau:
globalVariable = 1; globalFunction = function () { ... };

Nhng cc bin global nn trnh s dng, v xin nh cn thn rng khi khai bo bin th dng t kha var thc hin. 5. Cng ng Cng ng pht trin Node.js ch yu tp trung hai nhm google : nodejs v nodejs-dev, mt knh IRC l #node.js trn mng freenode. C mt hi tho v Node.js l NodeConf c t chc thng nin. Hin nay Node.js c s dng bi nhiu cng ty trong c Linkedin, Microsoft, Yahoo! v Walmart. II. Installation 1. Installing Node.js . Hin nhin l bn phi hc cch ci t node trc khi mun vit v chy bt c ng dng no trn nn node. Ci t node th rt l n gin, bn l ngi s dng window hay linux

th trn website nodejs.org u c nhng b ci tng ng, bn ch cn download v v ci t nh thng thng. Vi linux th bn s dng package manager, bt ca s terminal v type:
sudo apt-get update sudo apt-get install node

Hoc:
sudo aptitude update sudo aptitude install node

Bn c th cn thm Node.js vo danh sch m ngun bng lnh sau:


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

Cn trng khi ci sid packages trn nhng h thng c hn c th lm h thng ca bn b nh hng, hay cn thn v remove /etc/apt/sources.list.d/sid.list sau khi bn ci xong Node. 2. Installing New Modules Node.js c mt ng dng qun l packages, l Node Packgate Manager (NPM). ng dng ny t ng c ci t khi bn ci Node.js v bn dng NPM ci t cc module khc. ci t mt module, bn m ca s command line ca nodejs ra, vo ng dn tng ng v nhp lnh:
npm install module_name

Khng ph thuc vo h iu hnh bn dng, lnh trn s ci module m bn mong mun ch nh. III. Cc objects c bn. 1. Global Objects (i tng ton cc). Nh chng ta bit, h thng m-un ca node khng khuyn khch vic s dng bin ton cc, tuy nhin node cung cp mt globals quan trng s dng. Vic u tin v quan trng nht l tin trnh global, cho thy nhiu thao tc nh qu trnh truyn tn hiu, xut cnh, proccess id (pid), v nhiu hn na. Globals khc, chng hn nh console obiects c cung cp cho nhng ngi s dng vit JavaScript cho trnh duyt web. a. Console

Cc console obiects s dng mt s lnh c s dng xut thng tin stdout hoc stderr. Chng l cc lnh nh: console.log ([data], [...]) Phng php console obiects c s dng thng xuyn nht l console.log(), m ch n gin l vit cho stdout v gn mt ngun cp d liu dng (\ n
console.log (wahoo '); // => Wahoo console.log ({foo: 'bar'}); // => [Object Object]

Cn mt lnh c chc nng nh console.log() l console.info(). console.error ([data], [...]) Ging ht nhau console.log(), tuy nhin vit cho stderr.
console.error ('kt ni c s d liu khng thnh cng ');

Cn mt lnh c chc nng nh console.error() l console.warn(). console.dir (obj) S dng phng php inspect() ca m-un sys kh-in cc i tng n stdout. console.dir ({foo: 'bar'}); / / => {Foo: 'bar'} console.assert (expression, [message]) Nu expression b nh gi l c gi tr l false th AssertionError s a ra message c cho.
console.assert (connected, 'C s d liu kt ni khng thnh cng ');

console.time(label) nh du thi gian bt u. console.timeEnd (label) Thi gian kt thc, c ghi vo u ra.V d:
console.time('100-elements'); for (var i = 0; i < 100; i++) { ; } console.timeEnd('100-elements');

console.trace(label)

In mt tp stack cc du vt stderr ca v tr hin ti. b. Process Cc process object gn lin vi goodies. Trc tin, chng ta s c mt ci nhn ti mt s thuc tnh cung cp thng tin v node process : process.version Chui phin bn nt, v d:
console.log (' Version:' + process.version); // Version v0.8.16

process.execPath ng dn n th mc thc thi chnh ca chng trnh "/ usr / local / bin / node". process.platform Cc nn tng bn ang s dng. V d, "darwin". process.pid Cc process ID. process.stdout () Mt lung c th ghi c n stdout. V d: nh ngha v console.log().
console.log = function (d) { process.stdout.write (d + '\ n'); };

process.stderr () Tng t nh process.stdout() nhng y l ghi n stderr.


process.stderr() v process.stdout() l khng ging nh lung khc trong Node,

khi vit chng thng b blocking. Chng b blocking trong trng hp m chng lin quan n cc tp tin thng xuyn hoc m t tp tin TTY. Trong trng hp chng lin quan n cc pipes, chng khng b blocking nh nhng lung khc. process.stdin () Mt lung c th c c cho stdin. Cc dng stdin b tm dng theo mc nh, do , ngi ta phi gi process.stdin.resume () c t n. V d m u vo chun v lng nghe c hai s kin:
process.stdin.resume (); process.stdin.setEncoding ('utf8');

process.stdin.on ('data', function (chunk) { process.stdout.write ('data: ' + chunk); }); process.stdin.on (end', function () { process.stdout.write (' end'); });

process.cwd ( ) Tr v th mc lm vic hin ti. V d:


cd ~ && node node> process.cwd() "/Users/tj"

process.chdir ( ) Thay i th mc lm vic hin ti.


process.chdir('/ foo');

process.getuid ( ) Tr v s user ID ca process ang chy. process.setuid ( ) Thit lp user ID c hiu lc cho qu trnh ang chy. Phng php ny chp nhn c mt s ID, cng nh mt chui. V d c hai process.setuid(501), v process.setuid('tj') u hp l. process.getgid ( ) Tr v s group ID ca process ang chy. process.setgid ( ) Tng t nh process.setuid() tuy nhin c s dng trong group, cng chp nhn mt s gi tr hoc chui i din. V d, process.setgid(20) hoc process.setgid('www'). process.chdir (directory) Thay i th mc lm vic hin ti ca process hoc a mt ngoi l nu tht bi.
console.log ('Starting directory: '+ process.cwd ()); try { process.chdir ('/ tmp'); console.log ('New directory:' + process.cwd ()); } catch (err) {

console.log ('chdir: '+ err); }

process.env Mt i tng c cha cc bin mi trng ca ngi s dng. V d:


{ PATH: '/Users/tj/.gem/ruby/1.8/bin:/Users/tj/.nvm/current/bin:/usr/bin:/bin:/u s /sbin:/sbin:/usr/local/bin:/usr/X1 , PWD: '/Users/tj/ebooks/masteringnode' , EDITOR: 'mate' , LANG: 'en_CA.UTF-8' , SHLVL: '1' , HOME: '/Users/tj' , LOGNAME: 'tj' , DISPLAY: '/tmp/launch-YCkT03/org.x:0' , _: '/usr/local/bin/node' , OLDPWD: '/Users/tj' }

process.argv Khi thc hin mt tp tin vi cc nt thc thi process.argv cung cp truy cp vo cc vector i s, gi tr u tin l nt thc thi, th hai l tn tp tin, v gi tr cn li l cc i s c thng qua. V d, tp tin ngun ca chng ta ./src/process/misc.js c th c thc hin bng cch chy:
$ node src/process/misc.js foo bar baz

m chng ta gi console.dir(process.argv), xut ra nh sau:


[ 'node' , '/Users/tj/EBooks/masteringnode/src/process/misc.js' , 'foo' , 'bar' , 'baz' ]

process.exit ([code]) Lnh process.exit() l ng ngha vi hm C exit(), trong code > 0 c bit l tht bi, hoc 0 c bit l thnh cng. Khi c gi, vic exit c pht ra, cho php mt thi gian ngn ch bin ty xy ra trc khi process.reallyExit() c gi vi m trng thi nht nh. process.on ( ) Process t n l mt EventEmitter, cho php bn lm nhng iu nh lng nghe cho cc trng hp ngoi l cha b bt thng qua s kin uncaughtException:
process.on('uncaughtException', function(err){ console.log('got an error: %s', err.message); process.exit(1); }); setTimeout(function(){ throw new Error('fail'); }, 100);

process.kill (pid, [signal]) Lnh process.kill() gi tn hiu thng qua pid nht nh, mc nh cho SIGINT. Trong v d di y, chng ta gi tn hiu SIGTERM n qu trnh cng mt nt minh ha by tn hiu, sau chng ta ra " terminating " v thot ra. Lu rng thi gian ch th hai ca 1000 mili giy l khng bao gi t c.
process.on ('SIGTERM', function () { console.log('terminating'); process.exit(1); }); setTimeout(function(){ console.log('sending SIGTERM to process %d', process.pid); process.kill(process.pid, 'SIGTERM'); }, 500); setTimeout(function(){ console.log('never called'); }, 1000); });

Errno Process object ny lu tr ca cc con s bo hiu li ti my ch, tham kho nhng g bn s tm thy trong C-land. V d, process.EPERM i din cho mt li da trn s cho php, trong khi process.ENOENT i din cho mt tp tin hoc th mc b thiu. Thng thng y l nhng c s dng trong cc rng buc thu hp khong cch gia C++ v JavaScript, nhng chng hu ch cho vic x l cc trng hp ngoi l nh:
if (err.errno === process.ENOENT) { // Display a 404 "Not Found" page } else { // Display a 500 "Internal Server Error" page }

c. Buffers C bn JavaScript l Unicode thn thin, nhng khng phi vi d liu nh phn. Khi giao tip vi lung TCP hoc h thng tp tin, liu nh phn cn thit x l cc lung octet. Node cung cp mt s phng php cho vic khai thc, to v s dng lung octet. x l cc d liu nh phn, node cung cp cho chng t a vi cc i tng ton cc. Buffer l tng t nh mt mng cc s nguyn, nhng tng ng vi vic cp pht b nh th bn ngoi V8 heap. Buffer khng th c thay i kch c. C mt s cch xy dng mt trng hp b m, v nhiu cch bn c th thao tc d liu ca n. Chuyn i gia Buffers v cc i tng chui JavaScript i hi mt phng php m ha r rng. Di y l chui cc bng m khc nhau. 'ascii' - 7 bit d liu ASCII duy nht. Phng php m ha ny l rt nhanh chng, v s loi b cc bit cao nu thit lp. Lu rng vic m ha ny chuyn i mt k t null ('\ 0' hoc '\ u0000') vo 0x20 (m k t ca mt khng gian). Nu bn mun chuyn i mt k t null vo 0x00, bn nn s dng 'utf8'. 'utf8' - Nhiu byte m ha k t Unicode. Nhiu trang web v cc nh dng ti liu khc s dng UTF-8. 'utf16le - 2 hoc 4 byte, k t Unicode m ha t v cui. Cc cp i din (U 10.000 FFFF 10 U) c h tr. 'UCS2' - Tng t 'utf16le'. 'base64' - M ha chui Base64.

'binary' - Mt cch m ha d liu nh phn thnh chui bng cch s dng 8 bit u tin ca mi k t. Phng php m ha ny b phn i v nn trnh s dng cc i tng b m nu c th. M ha ny s c loi b trong cc phin bn tng lai ca Node. 'hex' - M ha mi byte l hai k t thp lc phn. Buffer cng c th c s dng xem mng kiu v DataViews.
var buff = new Buffer(4); var ui16 = new Uint16Array(buff); var view = new DataView(buff); ui16[0] = 1; ui16[1] = 2; console.log(buff); view.setInt16(0, 1); // set big-endian int16 at byte offset 0

view.setInt16(2, 2, true); // set little-endian int16 at byte offset 2 console.log(buff); // <Buffer 01 00 02 00> // <Buffer 00 01 02 00>

Cch n gin nht xy dng mt b m t mt chui ch n gin l s dng chui nh l tham s u tin. Nh bn c th nhn thy trong ng nhp, by gi chng ta c mt i tng b m c cha 5 byte d liu c i din trong h thp lc phn.
var hello = new Buffer ('Hello'); console.log (hello); // => <Buffer 48 65 6c 6c 6f> console.log (hello.toString ()); // => "Hello"

Theo mc nh, m ha l "utf8", nhng iu ny c th c thay i bng cch i qua mt chui nh l i s th hai. V d, du chm lng di y s c in stdout nh k t "&" khi trong bng m " ascii ".
var buf = new Buffer(''); console.log(buf.toString()); // => var buf = new Buffer('', 'ascii'); console.log(buf.toString()); // => &

Mt s thay th cu lnh (nhng trong trng hp ny hm tng ng) vt qua mt mng cc s nguyn i din cho dng octet.
var hello = new Buffer ([0x48, 0x65, 0x6c, 0x6c, 0x6f);

B m cng c th c to ra vi mt s nguyn i din cho s lng cc byte c phn b, sau chng ta c th gi lnh write(), cung cp mt offset v m ha. Di y, chng ta cung cp mt offset ca 2 byte cuc gi th hai ca chng ta write() (buffering "Hel") v sau vit 2 byte vi offset ca 3 (completing "Hello")
var buf = new Buffer(5); buf.write('He'); buf.write('l', 2); buf.write('lo', 3); console.log(buf.toString()); // => "Hello"

The .length ca mt trng hp b m cha byte chiu di ca lung (stream), tri ngc vi chui cc b, ch n gin l tr li s k t. V d, k t ellipsis '-' bao gm ba byte, do , cc b m s phn ng vi chiu di byte (3), v khng phi l chiu di k t (1).
var ellipsis = new Buffer('', 'utf8'); console.log(' string length: %d', ''.length); // => string length: 1

console.log(' byte length: %d', ellipsis.length); // => byte length: 3

console.log(ellipsis); // => <Buffer e2 80 a6>

xc nh di byte ca mt chui cc b, truyn n lnh Buffer.byteLength(). API c vit bng mt cch nh vy m n ging nh l String. V d, chng ta c th lm vic vi cc " slices" ca b m bng cch truyn offset cho cu lnh Slice():
var chunk = buf.slice(4, 9); console.log(chunk.toString()); // => "some"

Ngoi ra, khi i mt chui, chng ta c th truyn offset n Buffer#toString():

var buf = new Buffer('just some data'); console.log(buf.toString('ascii', 4, 9)); // => "some"

2. S kin (Event). Khi nim v mt "s kin" l rt quan trng trong node, v c s dng rt nhiu trong sut module chnh ca chng trnh v module ca bn th 3. Module s kin chnh ca Node cung cp cho chng ta vi mt hm to, EventEmitter. a. EventEmitter Thng thng mt i tng k tha t EventEmitter, tuy nhin v d nh di y minh ha API. u tin chng ta to ra mt emitter, sau chng ta c th xc nh bt k s lng callbacks s dng emitter.on() phng php, m chp nhn tn ca cc s kin v cc i tng ty thng qua nh l d liu. Khi emitter.emit() c gi, chng ta ch required truyn cc tn s kin, theo sau bi bt k s lng tham s (trong trng hp ny cc chui tn u tin v cui cng).
var EventEmitter = require('events').EventEmitter; var emitter = new EventEmitter; emitter.on('name', function(first, last){ console.log(first }); emitter.emit('name', 'tj', 'holowaychuk'); emitter.emit('name', 'simon', 'holowaychuk'); ', ' last);

b. K tha t EventEmitter ( Inheriting From EventEmitter ). c s dng ph bin v thit thc ca EventEmitter l tnh k tha t n. iu ny c ngha l chng ta c th gi nguyn EventEmitter nguyn mu m khng b nh hng trong khi s dng API ca n i vi phng tin ring ca chng ta. lm nh vy, chng ta bt u bng cch xc nh cc hm khi to Dog, trong tt nhin s bark t thi gian n thi gian (cn c bit n nh mt s kin).
var EventEmitter = require('events').EventEmitter; function Dog(name) { this.name = name; }

y chng ta k tha t EventEmitter v vy chng ta c th s dng cc phng thc m n cung cp, chng hn nh EventEmitter#on() v EventEmitter#emit (). Nu thuc tnh proto b loi tr, ng lo lng, chng s c tr li ny sau.
Dog.prototype. proto = EventEmitter.prototype;

By gi chng ta c Dog c thnh lp, chng ta c th to ra ... Simon! Khi Simon bark, chng ta c th cho stdout bit bng cch gi console.log() vi callback. Callback chnh n c gi l trong ng cnh ca cc i tng
var simon = new Dog('simon'); simon.on('bark', function(){ console.log(this.name }); ' barked');

Bark hai ln mi giy:


setInterval(function(){ simon.emit('bark'); }, 500);

c. Loi b cc s kin lng nghe (Removing Event Listeners). Nh chng ta bit, lng nghe s kin ch n gin l hm c gi khi chng ta emit() mt s kin. Chng ta c th loi b nhng ngi nghe bng cch dng lnh removeListener(type, callback), mc d iu ny khng c dng thng xuyn. Trong v d di y, chng ta pht ra thng bo "foo bar" mi 300 mili giy, trong c mt cuc gi li ca console.log(). Sau 1000 mili giy, chng ta gi removeListener() vi cc i s tng t m ti thng qua on() ban u. Chng ta cng c th s dng removeAllListeners(type), trong loi b tt c cc ngi nghe c ng k type nht nh.
var EventEmitter = require('events').EventEmitter; var emitter = new EventEmitter; emitter.on('message', console.log); setInterval(function(){ emitter.emit('message', 'foo bar'); }, 300); setTimeout(function(){ emitter.removeListener('message', console.log); }, 1000);

3. Lung ( Streams ).

Streams l mt khi nim quan trng trong nt. Cc lung API l mt cch duy nht x l lung ging nh d liu. V d, d liu c th c xem trc tip mt tp tin, trc tip vo mt socket p ng mt HTTP request, hoc trc tip t mt ngun ch cho c nh stdin. by gi, chng ta s tp trung vo cc API, li cc chi tit c th lung chng sau. a. Readable Streams Readable Streams c xem nh mt HTTP request k tha t EventEmitter l d liu n qua cc s kin. Vic u tin ca nhng s kin ny l s kin d liu, l mt on ty ca cc d liu c truyn i x l s kin nh l mt trng hp m ( Buffer instance ).
req.on('data', function(buf){ // Lm g vi Buffer });

Mt s kin quan trng khc l kt thc, i din cho s kt thc ca d liu s kin. V d, y l mt HTTP echo server, ch n gin l "simply" cc request body data thng qua cc response. V vy, nu chng ta POST "hello world", response ca chng ta s l " hello world ".
var http = require('http'); http.createServer(function(req, res){ res.writeHead(200); req.on('data', function(data){ res.write(data); }); req.on('end', function(){ res.end(); }); }).listen(3000);

Module sys thc s c mt chc nng c thit k c bit cho hnh ng "simply" ny, aptly tn sys.pump(). N chp nhn mt lung c nh l i s u tin, v vit dng th hai.
var http = require('http'), sys = require('sys'); http.createServer(function(req, res){ res.writeHead(200);

sys.pump(req, res); }).listen(3000);

stream.readable Gi tr boolean c mc nh l true, nhng s thnh false sau khi xy ra mt li, lung n mt 'kt thc', hoc destroy() c gi. stream.setEncoding ([encoding]) Lm cho 'data' s kin pht ra mt chui thay v mt b m. encoding c th l 'utf8', 'utf16le'('UCS2'),'ascii', hoc 'hex'. Mc nh l 'utf8'. Nh chng ta bit, chng ta c th gi toString() trn mt b m tr v mt chui i din ca d liu nh phn. Tng t nh vy, chng ta c th gi setEncoding() trn mt lung, sau d liu s kin s pht ra chui.
req.setEncoding('utf8'); req.on('data', function(str){ // Lm g vi String });

stream.pause () Vn l mt tn hiu t vn cho cc lp giao tip c bn, yu cu khng c thm d liu c gi cho n khi resume() c gi. Lu rng, do tnh cht t vn, lung nht nh s khng c tm dng ngay lp tc, v do , s kin 'data' c th c pht ra cho mt khong thi gian khng xc nh, ngay c sau khi pause() c gi. stream.resume () Tip tc li s kin 'data' sau khi pause(). stream.destroy () ng tp tin m t c bn. Stream l khng cn c th ghi v cng khng th c c. Cc dng s khng pht ra bt k chi tit 'data', hoc s kin 'kt thc'. Bt k d liu ghi xp hng s khng c gi i. Cc lung c ti s kin 'close' khi ngun lc ca mnh c x l. stream.pipe (destination, [options]) y l mt phng php Stream.prototype c sn trn tt c cc lung. Kt ni ny c dng WriteStream im n. D liu n trn lung ny c ghi n ch. Cc lung ch v ngun c gi ng b bng cch tm dng v khi phc khi cn thit. Chc nng ny tr v cc lung ch.

Theo mc nh end() c gi l im n khi i qua lung ngun pht ra cui cng, do , im n m khng th ghi c. {end: false} l ty chn gi cho lung ch m. iu ny gi process.stdout m rng "Goodbye" c th c vit cui.
process.stdin.resume(); process.stdin.pipe (process.stdout, {end: false}); process.stdin.on ("end", function () { process.stdout.write ("Goodbye \ n");});

b. Writable Stream. Mt lp c s cho vic to ra cc Writable Stream. Tng t nh Readable Stream, bn c c th to ra cc lp con bng cch ghi khng ng b khi s dng cu lnh _write(chunk, cb). stream.writable Gi tr boolean c mc nh l true, nhng s thnh false sau khi li xy ra hoc end() /destroy() c gi. stream.Write (string, [encoding]) Vit chui vi encoding cho lung. Tr v true nu chui c b vo b m kernel. Tr v false cho bit rng b m kernel y, v d liu s c gi i trong tng lai. S kin 'drain' s cho bit khi no b m kernel l rng mt ln na. Vic m ha mc nh 'utf8'. stream.Write (buffer) Tng t nh trn, ngoi tr vi mt b m th. stream.end () Kt thc dng vi EOF hoc FIN. Cuc gi ny s cho php hng i ghi d liu c gi trc khi ng lung. stream.end (string, encoding) Gi chui vi m ha nht nh v chm dt dng vi EOF hoc FIN. iu ny rt hu ch gim s lng cc gi tin gi i. stream.end (buffer) Tng t nh trn, nhng vi mt b m. stream.destroy () ng m t tp tin c bn. Stream l khng cn c th ghi v cng khng th c c. cc lung s khng pht ra bt k chi tit 'data', hoc s kin 'kt thc'. Bt k hng i d liu ghi s khng c gi i. cc lung c ti s kin 'close' khi ti nguyn ca mnh

c x l. stream.destroySoon () Sau khi ghi hng i c gii phng, ng tp tin m t. destroySoon() vn c th hy ngay lp tc, min l khng c d liu cn li trong hng i vit. 4. File System lm vic vi h thng tp tin, node cung cp module "fs". Cc lnh thc thi cc hot ng POSIX, v hu ht cc phng php lm vic ng b hoc khng ng b. Chng ta s xem xt lm th no s dng c hai, sau thit lp la chn tt hn. a. Lm vic vi tp tin h thng. Cho php bt u vi mt v d c bn lm vic vi tp tin h thng. V d ny to mt th mc, to ra mt tp tin bn trong n, sau vit ni dung ca tp tin n console:
var fs = require('fs');

fs.mkdir('./helloDir',0777, function (err) { if (err) throw err;

fs.writeFile('./helloDir/message.txt', 'Hello Node', function (err) { if (err) throw err; console.log('file created with contents:');

fs.readFile('./helloDir/message.txt','UTF-8' ,function (err, data) { if (err) throw err; console.log(data); }); }); });

R rng trong v d trn, ng vi mi callback u t trong callback trc y c gi l callbacks chainable. M hnh ny cn c theo sau khi s dng phng php khng ng b, khng c m bo rng cc hot ng s c hon thnh theo th t h ang to ra . iu ny c th dn n hnh vi khng th on trc. V d c th c vit li s dng mt cch tip cn ng b:

fs.mkdirSync('./helloDirSync',0777); fs.writeFileSync('./helloDirSync/message.txt', 'Hello Node'); var data = fs.readFileSync('./helloDirSync/message.txt','UTF-8'); console.log('file created with contents:'); console.log(data);

N l tt hn s dng phng php khng ng b trn cc my ch vi mt ti cao, nh cc phng php ng b s lm cho ton b qu trnh ngn chn v ch cho cc hot ng hon thnh. iu ny s ngn chn bt k kt ni n hoc cc s kin khc. b. File thng tin Cc i tng fs.Stats c cha thng tin v mt tp tin hoc th mc c th. iu ny c th c s dng xc nh loi i tng m chng ta ang lm vic. Trong v d ny, chng ta ang nhn c tt c cc i tng tp tin trong mt th mc v hin th cho d chng l mt tp tin hoc mt i tng th mc.
var fs = require('fs'); fs.readdir('/etc/', function (err, files) { if (err) throw err; files.forEach( function (file) { fs.stat('/etc/' + file, function (err, stats) { if (err) throw err; if (stats.isFile()) { console.log("%s is file", file); } else if (stats.isDirectory ()) { console.log("%s is a directory", file); } console.log('stats: }); }); }); %s',JSON.stringify(stats));

c. Xem cc tp tin. Phng php fs.watchfile theo di mt tp tin v thay i mt s kin bt c khi no tp tin c thay i.

var fs = require('fs'); fs.watchFile('./testFile.txt', function (curr, prev) { console.log('the current mtime is: ' + curr.mtime); console.log('the previous mtime was: ' + prev.mtime); }); fs.writeFile('./testFile.txt', "changed", function (err) { if (err) throw err; console.log("file write complete"); });

Mt tp tin cng c th c unwatched bng cch s dng phng php gi fs.unwatchFile. Cch ny ch nn s dng mt ln khi tp tin khng cn cn c gim st . 5. HTTP. s dng HTTP server v client phi dng lnh require('http'). Cc giao din HTTP trong Node c thit k h tr nhiu tnh nng ca cc giao thc truyn thng kh s dng. Trong , c th l on m ha, tin nhn. HTTP headers c biu din bi mt i tng nh th ny:
{ 'content-length': '123', 'content-type': 'text/plain', 'connection': 'keep-alive', 'accept': '*/*' }

Key c lowercased v gi tr khng c sa i. http.STATUS_CODES Mt b su tp ca tt c cc m trng thi tiu chun ca HTTP response, v m t ngn gn cho tng ci. V d, http.STATUS_CODES [404] === 'Not Found'. http.createServer ([requestListener]) Tr v mt i tng web server mi. RequestListener l mt chc nng c t ng thm vo s kin 'request'. http.createClient ([port], [host])

Hm ny b phn i s dng, hy s dng http.request() thay th. Xy dng mt HTTP client mi. Port v host tham chiu n my ch c kt ni. a. Class: http.Server. server.listen(port, [hostname], [backlog], [callback]) Bt u chp nhn cc kt ni trn port ch nh v hostname. Nu hostname c b qua, cc server s chp nhn cc kt ni trc tip n bt k a ch IPv4 (INADDR_ANY). nghe mt socket unix, cung cp mt tn tp tin thay v port v hostname. Backlog l chiu di ti a ca hng i kt ni ang ch. Chiu di thc t s c xc nh bi h iu hnh thng qua cc thit lp sysctl nh tcp_max_syn_backlog v somaxconn trn Linux. Gi tr mc nh ca tham s ny l 511 (khng phi 512). Hm ny l khng ng b . Gi li tham s cui cng s c thm vo nh l mt listener cho s kin 'listen'. Xem thm net.Server.listen(port). server.listen (path, [callback]) Bt u mt my ch socket UNIX lng nghe cho cc kt ni trn ng dn nht nh. Hm ny l khng ng b. Gi li tham s cui cng s c thm vo nh l mt ngi bit lng nghe cho s kin'listen'. Xem thm net.Server.listen (path). server.listen (handle, [callback]) Cc i tng c th c thit lp x l mt my ch hoc socket, hoc i tng
{fd: <n>}.

Lng nghe trn mt m t tp tin khng c h tr trn Windows. Chc nng ny l khng ng b. Gi li tham s cui cng s c thm vo nh l mt ngi bit lng nghe cho s kin 'listen'. Xem thm net.Server.listen(). server.close ([callback]) Dng server v chp nhn cc kt ni mi. Xem net.Server.close(). server.maxHeadersCount Gii hn ti a headers count n, l 1000 theo mc nh. Nu thit lp l 0 - khng c gii hn c p dng. b. Class: http.ServerRequest.

i tng ny c to ra trong ni b ca mt my ch HTTP - khng phi bi ngi s dng - v thng qua nh l i s u tin mt listener 'request'. Request thc hin cc giao din Readable Streams. request.method Yu cu mt chui. Ch c. V d: 'GET', 'DELETE'. request.url Yu cu chui URL. Cu lnh ny ch cha cc URL theo thc t trong HTTP request. Nu request l:
GET /status?name=ryan HTTP/1.1\r\n Accept: text/plain\r\n \r\n Th request.url s l: '/status?name=ryan'

Nu bn mun phn tch cc URL thnh cc phn ca n, bn c th s dng require('url').parse(request.url). V d:


node> require('url').parse('/status?name=ryan') { href: '/status?name=ryan', search: '?name=ryan', query: 'name=ryan', pathname: '/status' }

Nu bn mun trch xut cc params t chui truy vn, bn c th s dng require('querystring').parse, hoc thng qua cc i s th hai require('url').parse. Phn tch c php. V d:
node> require('url').parse('/status?name=ryan', true) { href: '/status?name=ryan', search: '?name=ryan', query: { name: 'ryan' }, pathname: '/status' }

request.headers c bn duy nht ca tn header v gi tr. Tn header l lower-cased. V d:


// In mt ci g nh:

// {User-agent ':' curl/7.22.0 ' // Host: '127 .0.0.1:8000 ', // accept: '*/*' } console.log(request.headers);

request.trailers Ch c HTTP trailer (nu c). request.httpVersion Phin bn giao thc HTTP nh mt chui. Ch c. V d: '1.1 ', '1.0'. Ngoi ra request.httpVersionMajor l s nguyn u tin v request.httpVersionMinor l th hai. request.setEncoding ([encoding]) Thit lp m ha cho c ch request. Xem stream.setEncoding() bit thm thng tin. request.pause () Tm dng request t cc s kin pht ra. Rt hu ch tng tc ti ln. request.resume () Tip tc li request tm dng. request.connection Cc i tng net.Socket kt hp vi kt ni. Vi h tr HTTPS, s dng request.connection.verifyPeer() v request.connection.getPeerCertificate() c c thng tin xc thc ca client. c. Class: http.ServerResponse. i tng ny c to ra trong ni b ca mt HTTP server - khng phi bi ngi s dng. N c thng qua nh l tham s th hai ca s kin 'request'. Response thc hin cc giao din Writable Stream. response.writeHead (statusCode [reasonPhrase], [headers]) Gi mt response headers p ng yu cu. statusCode l mt trng t hi HTTP c 3 ch s m, ging nh 404. Ty chn c th a ra mt reasonPhrase nh l i s th hai. V d:
var body = 'hello world'; response.writeHead(200, { 'Content-Length': body.length,

'Content-Type': 'text/plain' });

Cu lnh ny ch c gi l mt ln trn mt tin nhn v n phi c gi trc khi response.end() c gi. Nu bn gi response.write() hoc response.end() trc khi gi, header ngm nh s c tnh ton v gi hm ny cho bn. Lu : rng Content-Length c a ra trong cc byte khng phi k t. V d trn lm vic v chui 'hello world' cha cc byte k t duy nht. Nu n cha cc k t c m ha cao hn th sau Buffer.byteLength() nn c s dng xc nh s byte trong mt on m ha nht nh. V Node khng ki m tra Content-Length v di ca thn c truyn i bng nhau hay khng. response.statusCode Khi s dng cc header n (khng gi response.writeHead() mt cch r rng), hm iu khin cc m trng thi s c gi n cho client khi cc header nhn c. V d:
response.statusCode = 404;

Sau khi response header c gi cho client, hm ny ch ra cc m trng thi c gi. response.setHeader (name, value) Thit lp mt gi tr header duy nht cho header n. Nu header ny tn ti trong phn header c gi, gi tr ca n s c thay th. S dng mt mng cc chui y nu bn cn phi gi nhiu header vi cng mt tn. V d:
response.setHeader ("Content-Type", "text / html");

hoc
response.setHeader ("Set-Cookie", "loi = ninja", "ngn ng = javascript "]);

response.sendDate Khi gi tr l true, date header s c t ng to ra v gi response nu n khng phi l c trong cc header. Mc nh l true. response.getHeader (name) c ra mt header c xp hng i nhng khng gi cho client. iu ny ch c th c gi l trc khi header nhn c.

V d:
var contentType = response.getHeader ('content-type');

response.removeHeader (name) Loi b mt header xp hng i gi ngm. V d:


response.removeHeader ("Content-Encoding");

response.write (chunk, [encoding]) Nu hm ny c gi v response.writeHead() c gi, n s chuyn sang ch header n v lun xut ra cc header n. Phng php ny c th c gi l nhiu ln cung cp cc b phn lin tip nhau. chuck c th l mt chui hoc mt b m. Nu chuck l mt chui, tham s th hai xc nh lm th no m ha n thnh mt dng byte. Theo mc nh, m ha l 'utf8'. Khi response.write() c gi ln u tin, n s gi cc thng tin header m v thn u tin cho client. Khi response.write() c gi ln th hai, Node gi nh bn s c d liu, v gi ring d liu. Tr v true nu ton b d liu c xut thnh cng n kernel buffer. Tr v false nu tt c hoc mt phn ca d liu c xp hng i trong b nh ca ngi s dng. 'drain' s c pht ra khi b m trng mt ln na. response.end ([data], [encoding]) Vi hm ny, tn hiu n server m tt c cc response headers v phn thn c gi, server nn xem xt hon thnh tin nhn ny. response.end() phi c gi l trn mi cu tr li. Nu d liu c quy nh c th, l tng ng vi gi response.write (data, encoding) tip theo response.end(). d. http.ClientResponse. i tng ny c to ra khi thc hin mt yu cu vi http.request(). N c thng qua vi s kin 'response' ca i tng yu cu. response thc hin cc giao din Readable Stream. response.statusCode 3 ch s m trng thi ca HTTP response. V D: 404. response.httpVersion Cc phin bn HTTP ca my ch kt ni. C th hoc l '1.1 'hoc '1.0'. Ngoi ra response.httpVersionMajor l s nguyn u tin v response.httpVersionMinor l

th hai. response.headers i tng response headers . response.trailers Trailer i tng response. response.setEncoding ([encoding]) Thit lp m ha cho c th phn ng. Xem stream.setEncoding () bit thm thng tin. response.pause () Tm dng response t cc s kin pht ra. Hu ch tng tc ti v. response.resume () Tip tc li mt response b tm dng. 6. c thm Nodejs Docs. Trn y ch l cc i tng c bn c nn ra, vn cha c y v vy mun tm hiu su v Node.js th nn xem cc ti liu ca Node API c bin son rt chi tit v lit k tt c cc lnh h thng tp tin c th c sn khi lm vic vi Node.js. IV. Cc ng dng c xy dng trn nn Node.js. 1. ng dng u tin. ng dng u tin bn nn to vi nodejs l ng dng in ch Hello World trn ca s console. To mt file vi tn hello.js, vi ni dung sau:
console.log('Hello World!');

chy script, m ca s command line ca node, a ng dn n hello.js v chy lnh:


node hello.js

Bn s thy ch Hello World hin ln trn ca s console. 2. HTTP Server. Hy n vi mt v d phc tp hn, c th hi ri khi bn tip xc ln u. hy c cc dng code sau v cc phn ghi ch:
// Khai bo http module.

var http = require("http"); // To server. Hm c thng qua nh mt tham s c gi l trn mi request c to ra. // Bin request nm gi tt c cc tham s request // Bin response cho bn lm bt c iu g vi response gi ti client. http.createServer(function (request, response) { // Gn listener ti thi im kt thc s kin. // S kin ny c gi khi client gi tt c d liu v i response t server. request.on("end", function () { // Vit headers cho response. // 200 l m trng thi ca HTTP (iu ny c ngha l thnh cng) // Tham s th hai gi trng header trong i tng // Chng ta ang gi mt vn bn n gin, do Content-Type nn l text/plain response.writeHead(200, { 'Content-Type': 'text/plain' }); // Gi d liu v kt thc response. response.end('Hello HTTP!'); }); // Lng nghe ti cng 8080. }).listen(8080);

Tht l n gin, bn c th gi d liu n cc client bng cch s dng response.write(), nhng bn phi gi n trc khi gi hm response.end(). Lu m trn thnh file http.js v nh lnh sau trn console:
node http.js

Sau m ca s trnh duyt browser n a ch http://localhost:8080. Bn s thy dng ch Hello HTTP!. on m sau l mt my ch TCP lng nghe trn cng 8080 v echo chui hello ra mi kt ni:
var net = require('net'); net.createServer(function (stream) {

stream.write('hello\r\n'); stream.on('end', function () { stream.end('goodbye\r\n'); }); stream.pipe(stream); }).listen(8080);

3. X l cc tham s URL Nh ni trc, ta phi t lm mi th trong node. Hy xem code ca v d sau:


// Khai bo http module. var http = require("http"), // v url module, n rt hu ch trong vic phn tch tham s request. url = require("url"); // To server. http.createServer(function (request, response) { // Gn listener v kt thc s kin. request.on('end', function () { // Phn tch request cho cc i s v lu chng trong bin _get. // Hm ny phn tch cc url t reqest v tr v cc i tng i din. var _get = url.parse(request.url, true).query; // Vit headers cho response. response.writeHead(200, { 'Content-Type': 'text/plain' }); // Gi d liu v kit thc response. response.end('Here is your data: ' + _get['data']); }); // Lng nghe ti cng 8080. }).listen(8080);

Phn code ny dng phng thc parse() ca module url, mt module li ca Nodejs, convert t request url thnh object. Phng thc tr li object l phng thc query, s ly li thng s ca URL. Lu file ny thnh get.js v thc thi trn ca s lnh:
node get.js

Sau vo ng dn: http://localhost:8080/?data=put_some_text_here xem kt qu. 4. c v vit file c v ghi file trong Node ta dng fs module, mt module sn c trong Node. Cc hm c v ghi file l fs.readFile() v fs.writeFile(). Ta c v d sau:
// Khai bo http module, var http = require("http"), // v mysql module. fs = require("fs"); // To http server. http.createServer(function (request, response) { // Gn listener v kt thc s kin. request.on('end', function () { // Kim tra nu l user requests / if (request.url == '/') { // c file. fs.readFile('test.txt', 'utf-8', function (error, data) { // Vit headers. response.writeHead(200, { 'Content-Type': 'text/plain' }); // Tng s thu c t file. data = parseInt(data) + 1; // Vit s tng vo file. fs.writeFile('test.txt', data); // Kt thc response vi tin nhn. response.end('This page was refreshed ' + data + ' times!');

}); } else { //Cho bit nu tp tin request khng c tm thy. response.writeHead(404); // v kt thc request m khng gi d liu no. response.end(); } }); // Lng nghe ti cng 8080. }).listen(8080);

Lu file li thnh file files.js. Trc khi chy file ny trn ca s command, to mt file test.txt cng th mc vi file file.js. Hy chy v kim tra kt qu. 5. Nodejs vi mysql Hu ht cc mi trng truyn thng chy server side u c nhng chc nng km theo thao tc vi database. Vi Node.js, bn phi ci thm th vin. Vi bi vit ny, ti chn mt th vin kh n nh dng. Tn y ca module th vin l: mysql@2.0.0-alpha2 (pha sau @ ch l tn phin bn). M ca s command, dng npm ci module ny ln vi lnh:
npm install mysql@2.0.0-alpha2

Lnh ny s download v ci t module, v n cng to mt folder trong th mc hin hnh. Bn hy quan st phn code sau bit thao tc vi csdl:
// Khai bo http module, var http = require('http'), // v mysql module. mysql = require("mysql"); // To kt ni. // D liu l mc nh ci t mi mysql v nn c thay i theo cu hnh ca bn. var connection = mysql.createConnection({ user: "root", password: "",

database: "db_name" }); // To http server. http.createServer(function (request, response) { // Gn listener v kt thc s kin. request.on('end', function () { // Truy vn c s d liu. connection.query('SELECT * FROM your_table;', function (error, rows, fields) { response.writeHead(200, { 'Content-Type': 'x-application/json' }); // Gi d liu l chui JSON. // Bin rows gi kt qu ca cc truy vn. response.end(JSON.stringify(rows)); }); }); // Lng nghe cng 8080. }).listen(8080);

Truy xut d liu vi th vin ny rt n gin, bn ch cn nhp cu lnh truy xut v gi hm. Trong cc ng dng thc t, bn nn kim tra nu xy ra li d dng debug, v tr li cc kt qu m li khi thc hin cu lnh thnh cng hay khng. Lu l trong v d ny ta cng set Content -type vi gi tr x-application/json, l mt gi tr MIME ca JSON. Tham s rows s lu gi kt qu ca truy vn, v ta chuyn i d liu trong rows sang cu trc ca JSON qua phng thc JSON.stringify(). Lu file li vi tn mysql.js sau thc thi trn ca s command, vi csdl mysql c ci t
Node mysql.js

Sau vo ng dn: http://localhost:8080 trn trnh duyt v bn s c nhc download file JSON-formatted

V. WebSocket vi Node.js v Socket.IO Socket.IO l mt th vin javascript c mc ch to ra cc ng dng realtime trn trnh duyt cng nh thit b di ng. Vic s dng th vin ny cng rt n gin v ging nhau c server ln client. Sau ci m ca s console v ci t Socket.io bng lnh sau:
npm install socket.io

1. Tm hiu v Socket.IO Vi Node.js, bn ch cn bit vi hm c bn nh requires() import th vin. Cng vic cn li, ch cn dng Socket.IO nn bn cn phi tm hiu v th vin ny ti y: http://socket.io/#how-to-use. - Server: to mt i tng socket bng phng thc listen(port). Phng thc ny ch i mt yu cu kt ni t client. - Client: Kt ni n server bng phng thc connect(url,{port: server_port}). - Socket.IO cung cp 3 event chnh l connect, message v disconnect. Chng c kch hot khi client/server: + connect: to kt ni + message: nhn c thng ip + disconnect: ngt kt ni V d:
socket.on("message", function(msg){ // console.log("Received: "+ msg); });

- gi d liu, ta dng lnh send(). D liu c th l i tng (c chuyn thnh chui json) v s nhn c qua s kin message. V d: socket.send("Hello world"); - Socket.IO c th gi v nhn cc event t to vi phng thc emit(). Hai pha gi v nhn phi bit c tn ca event thc hin giao tip: V d:
// gi: socket.emit("hello",{msg: "welcome"); // nhn: socket.on("hello", function (data) { console.log(data);

} );

2. ng dng tnh kt qu biu thc cho trc. S dng chng trnh notepad hoc cng c son tho lp trnh no to 2 file sau. Server.js: To mt tp tin server.js vi ni dung sau:
var io = require('socket.io'); var socket = io.listen(8080); socket.sockets.on('connection',function(socket){ socket.on('message', function(expr){ console.log('Received expression from client ',expr); // Bt li i vi biu thc xu try{ socket.send(eval(expr)); }catch(err){ socket.emit("error",err.message); } }); socket.on('disconnect', function(){ // console.log('Disconnected'); }); });

Client.html:
<html> <head> <title>WebSocket Client</title> <script src="http://localhost:8080/socket.io/socket.io.js"></script> <script> window.onload = function(){ var input = document.getElementById('input'); var output = document.getElementById('output');

var socket = io.connect('localhost',{port: 8080}); socket.on("connect",function(){ console.log("Connected to the server"); }); socket.on('message',function(data) { output.innerHTML = '=' + data; }); socket.on('error', function (data) { console.log("error:",data); } ); window.sendMessage = function(){ socket.send(input.value); }; } </script> </head> <body> <input type='text' id='input' /> <span id='output'></span> <br/> <input type='button' id='send' value='calc' onclick='sendMessage();' /> </body> </html>

Lu v thot khi cc tp tin. Di chuyn vo bn trong th mc bieuthuc v bt u chy ng dng.


node Server.js

By gi m file Client.html nhp biu thc v nhn kt qu. ng dng ch lm vic c vi biu thc tnh ton khng c du ngoc n. Kt qu:

3. ng dng webchat. a. Xy dng mt webchat server c bn. Trc tin, ta s nhp cc m-un Socket.IO.
var exp = require('express'); var app = exp.createServer();

Sau , ta s to ra mt bin ton cc duy nht ca Socket.IO c s dng chia s trn nhiu ng dng.
global.socket = require('socket.io').listen(app); global.socket.set('log level', 1); global.socket.set('transports', [ 'websocket', 'flashsocket', 'htmlfile', 'xhr-polling', 'jsonp-polling']);

Ta s ti tp tin cu hnh, router, v mt m-un chat-socket c sn trong cng mt thi im.


require('./app/config')(app, exp); require('./app/server/router')(app); require('./app/server/modules/chat-socket');

V sau khi ng server.


app.listen(8080, function(){ console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);

});

b. To module Server-Side chat socket. iu u tin ta cn lm l xc nh khng gian tn cho ng dng ny.Ta lm iu ny vi cu lnh socket.of ('namespace').
module.exports = function() { global.socket.of('/chat').on('connection', function(socket) { console.log("a user has connected to the 'chat' namespace"); }); }();

By gi ta c th thm mt s code theo di ngi s dng kt ni, pht tin nhn ca h v lng nghe khi h ngt kt ni. Nhng trc tin hy to mt mng cc mu m ta ngu nhin s gn cho ngi dng khi h kt ni phn bit nhau trong bng chat.
var colors = ['#AE331F', '#D68434', '#116A9F', '#360B95', '#5F209E'];

Tip theo ta s to ra mt " connections object " theo di ngi dng kt ni.
var connections = { };

Kch bn pha client s pht ra mt s kin "user -ready" sau khi mt ngi kt ni thnh cng v c giao mt tn. Server s lu tr gi tr trong socket server s dng trong tng lai. Server cng s giao cho ngi s dng mi c kt ni mt mu ngu nhin t mng mu sc c sn.
global.socket.of('/chat').on('connection', function(socket) { socket.on('user-ready', function(data) { socket.name = data.name; socket.color = data.color = colors[Math.floor(Math.random() * colors.length)]; // let everyone else in the room know a new user has just connected // brodcastMessage('user-ready', data); });

Ta s lng nghe cho n khi h ngt kt ni, do ta c th loi b chng t cc i tng kt ni v thng bo cho ngi s dng.
socket.on('disconnect', function() {

delete connections[socket.id]; dispatchStatus(); brodcastMessage('user-disconnected', { name : socket.name, color : socket.color }); }); dispatchStatus v broadcastMessage ch l cc shortcut pht s kin tr li vi

phn cn li ca nhm.
function dispatchStatus() { brodcastMessage('status', connections); } function brodcastMessage(message, data) { socket.emit(message, data); socket.broadcast.emit(message, data); }

Khi mt ngi dng gi tin nhn cho thm mu sc kt hp vi Socket ca mnh vo tin nhn chng ti c th hin th mu sc thch hp trong nht k tr chuyn khi pht tr li vi phn cn li ca nhm.
socket.on('user-message', function(data) { data.color = socket.color; brodcastMessage('user-message', data); });

c. Khi to kt ni trn Client Khi mt ngi dng kt ni vi ng dng webchat, ta s cung cp cho h mt tn mc nh. Khi gi tin nhn, ta s ly gi tr ny v thm n vo tin nhn c gi i.
$('#name').val(Math.random().toFixed(8).toString().substr(2)); socket = io.connect('/chat');

l nhng khng gian tn ring bit cho php cc ng dng chatc th duy tr quyn t ch trong khi chy nh tn min ph ca ng dng Node.
$('#btn-send').click(function(){ sendMessage(); }) var sendMessage = function() {

socket.emit('user-message', {name : $('#name').val() , message : $('#msg').val() }); $('#msg').val(''); } SendMessage ch n gin l ly cc gi tr c lu tr trong trng nhp tn v trng

vn bn # msg #, khin chng thnh mt i tng m chng ta c th pht ra tr li my ch. Sau khi tin nhn c gi chng ti s t ng xa vng vn bn # msg # v vy ngi dng c th gi mt tin nhn mi. Phn cn li ca cc m trn client ch n gin l lng nghe cho cc s kin n v cp nht cc cuc hi thoi ph hp.
socket.on('user-ready', function (data) { $('#incoming').append('<span class="shadow" style="color:'+data.color+'">'+data.name +' :: connected</span><br>'); }); socket.on('user-message', function (data) { $('#incoming').append('<span class="shadow" style="color:'+data.color+'">'+data.name +' :: '+ data.message+'</span><br>'); }); socket.on('user-disconnected', function (data) { $('#incoming').append('<span class="shadow" style="color:'+data.color+'">'+data.name +' :: disconnected</span><br>');

Lu , trong trang HTML hy chc chn rng c bao gm th vin Socket.IO c trong th mc node_modules ti th mc gc ca server.
<script src="/socket.io/socket.io.js"></script>

Ti thi im ny, chng ta c mt server webchat n gin c th lng nghe v gi tin nhn cho tt c ngi dng kt ni khng gian tn ca ng dng "/ chat". c c cc module v chy, cd vo tng ng dng v ci t ph thuc ca n:
cd mydomain.com npm install -d

Lu v thot khi cc tp tin. Di chuyn vo bn trong th mc mydomain.com v bt u chy ng dng.


node app.js

By gi m trnh duyt v vo ng dn :
http://localhost:8080

Kt qu:

Kt lun Node.js i hi phi lm thm nhiu vic, nhng phn thng ca mt ng dng nhanh chng v mnh m l gi tr n. Node.js l mt cng ngh y ha hn v l s la chn tuyt vi cho mt ng dng cn c hiu nng cao, nhiu kt ni. N c chng minh bi cc cng ty nh Microsoft, eBay v Yahoo.

You might also like