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

Node.js

PHP

100

2.00

0.14

10000

3.00

10.53

1000000

15.00

1119.24

10000000

143.00

10621.46

1000000000

11118.00

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 ta 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

', '

last);

});
emitter.emit('name', 'tj', 'holowaychuk');
emitter.emit('name', 'simon', 'holowaychuk');

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 thi 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 kim 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