
Node.JS - Basics
Eueung Mulyana
http://eueung.github.io/js/node-basics
JS CodeLabs | Attribution-ShareAlike CC BY-SA
1 / 30
Agenda
Checklist
Node Basics
2 / 30
 Checklist
3 / 30
SETnodejsVersion=5.2.0
SETnodejsArch=x64
nodejs-portable (admin)
setPATH=%APPDATA%npm;%~dp0;%PATH%
setPYTHON=f:progpy27python.exe
nodevars
npmconfigsetmsvs_version2013--global
npm
Settings - Example
echo%PYTHON%
#f:progpy27python.exe
npmconfigsetmsvs_version2013--global
npm-v
#3.3.12
4 / 30
 Node.JS Basics
5 / 30
Example #1 (http-1)
//alternative
consthttp=require('http');
consthostname='127.0.0.1';
constport=1337;
http.createServer((req,res)=>{
res.writeHead(200,{'Content-Type':'text/plain'});
res.end('HelloWorldn');
}).listen(port,hostname,()=>{
console.log(`Serverrunningathttp://${hostname}:${port}
});
varhttp=require('http');
http.createServer(function(req,res){
res.writeHead(200,{'Content-Type':'text/plain'});
res.end('helloworldn');
}).listen(8000,'127.0.0.1');
console.log('Serverrunningathttp://127.0.0.1:8000/');
$>nodeex-01-web.js
Serverrunningathttp://127.0.0.1:8000/
$>curlhttp://localhost:8000
helloworld
6 / 30
$>ab-n100-c100http://localhost:8000/
$>ab-n100-c100http://127.0.0.1:8000
$>ab-n100-c100http://127.0.0.1:8000/
ThisisApacheBench,...Benchmarking127.0.0.1(bepatient).....done
ServerHostname: 127.0.0.1
ServerPort: 8000
DocumentPath: /
ConcurrencyLevel: 100
Timetakenfortests: 2.059seconds
Completerequests: 100
Requestspersecond: 48.56[#/sec](mean)
Timeperrequest: 2059.203[ms](mean)
Timeperrequest: 20.592[ms](mean,acrossallconcurrentrequests)
Transferrate: 5.36[Kbytes/sec]received
ConnectionTimes(ms)
min mean[+/-sd]median max
Connect: 0 0 0.0 0 0
Processing: 19972021 8.4 2028 2028
Waiting: 47 51 8.7 47 78
Total: 19972021 8.4 2028 2028
Percentageoftherequestsservedwithinacertaintime(ms)
50% 2028
66% 2028
...
100% 2028(longestrequest)
Example #1 (http-2)
varhttp=require('http');
http.createServer(function(req,res){
res.writeHead(200,{'Content-Type':'text/plain'});
res.write('hellon');
setTimeout(function(){res.end('worldn');},2000);
}).listen(8000,'127.0.0.1');
7 / 30
Example #1 (http-3)
varhttp=require('http');
http.createServer(function(request,response){
varheaders=request.headers;
varmethod=request.method;
varurl=request.url;
varbody=[];
request.on('error',function(err){console.error(err);})
.on('data',function(chunk){body.push(chunk);})
.on('end',function(){
response.on('error',function(err){console.error(err
response.writeHead(200,{'Content-Type':'text/html'
response.end('<html><body><h1>Hello,World!</h1></body
});
}).listen(8080);
8 / 30
varhttp=require('http');
http.createServer(function(request,response){
varheaders=request.headers;
varmethod=request.method;
varurl=request.url;
varbody=[];
request.on('error',function(err){console.error(err);})
.on('data',function(chunk){body.push(chunk);})
.on('end',function(){
body=Buffer.concat(body).toString();
response.on('error',function(err){console.error(err);});
response.statusCode=200;
response.setHeader('Content-Type','application/json'
varresponseBody={
headers:headers,
method:method,
url:url,
body:body
};
response.write(JSON.stringify(responseBody));
response.end();
});
}).listen(8080);
Example #1 (http-4)
 
9 / 30
Example #1 (socket-1)
varnet=require('net');
varserver=net.createServer(function(socket){
socket.write('EchoServerrn');
socket.pipe(socket);
});
server.listen(1337,'127.0.0.1');
console.log('EchoServerrunningatport1337');
$>nodeex-01-net-echo1.js
EchoServerrunningatport1337
10 / 30
Example #1 (socket-2)
varnet=require('net');
net.createServer(function(socket){
socket.write('hellon');
socket.write('worldn');
socket.on('data',function(data){
socket.write(data.toString().toUpperCase())
});
}).listen(8000);
console.log('EchoServer-2runningatport8000');
$>nodeex-01-net-echo2.js
EchoServer-2runningatport8000
$>ncatlocalhost8000
hello
world
inidata
INIDATA
datalagi:echoserver2
DATALAGI:ECHOSERVER2
11 / 30
$>nodeex-01-net-server.js
serverislistening
clientconnected
clientdisconnected
varnet=require('net');
varserver=net.createServer(function(connection){
console.log('clientconnected');
connection.on('end',function(){console.log('clientdisconnected'
connection.write('HelloWorld!rn');
connection.pipe(connection);
});
server.listen(8080,function(){console.log('serverislistening'
Example #1 (socket-3)
$>nodeex-01-net-client.js
connectedtoserver!
HelloWorld!
disconnectedfromserver
varnet=require('net');
varclient=net.connect({port:8080},function(){console
client.on('data',function(data){
console.log(data.toString());
client.end();
});
client.on('end',function(){console.log('disconnectedfroms
12 / 30
Example #1 (socket-4)
$>ncatlocalhost8000
hello
world
testdarincat1
rogerncat1,inidarincat2
$>ncatlocalhost8000
hello
world
testdarincat1
rogerncat1,inidarincat2
Array.prototype.remove=function(from,to){
varrest=this.slice((to||from)+1||this.length);
this.length=from<0?this.length+from:from;
returnthis.push.apply(this,rest);
};
//Application
varnet=require('net');
varsockets=[];
net.createServer(function(socket){
sockets.push(socket);
socket.write('hellon');
socket.write('worldn');
socket.on('data',function(data){
vari;
for(i=0;i<sockets.length;i++){
if(sockets[i]===socket) continue;
sockets[i].write(data.toString());
}
});
socket.on('end',function(){
vari=sockets.indexOf(socket);
sockets.remove(i);
});
}).listen(8000);
13 / 30
Example #1
http echo server
varhttp=require('http');
http.createServer(function(request,response){
request.on('error',function(err){
console.error(err);
response.statusCode=400;
response.end();
});
response.on('error',function(err){console.error(err);});
if(request.method==='GET'&&request.url==='/echo'){
request.pipe(response);
}else{
response.statusCode=404;
response.end();
}
}).listen(8080);
14 / 30
Example #2
fs: synchronous vs. asynchronous
varfs=require("fs");
vardata=fs.readFileSync('ex-02-input.txt');
console.log(data.toString());
console.log("ProgramEnded");
$>nodeex-02-fs1.js
iniinputiniinputiniinput
inputiniinputini
inputinputinput
ProgramEnded
varfs=require("fs");
fs.readFile('ex-02-input.txt',function(err,data){
if(err)returnconsole.error(err);
console.log(data.toString());
});
console.log("ProgramEnded");
$>nodeex-02-fs2.js
ProgramEnded
iniinputiniinputiniinput
inputiniinputini
inputinputinput
15 / 30
Example #3 (events)
$>nodeex-03-event2.js
2Listner(s)listeningtoconnectionevent
listner1executed.
listner2executed.
Listner1willnotlistennow.
listner2executed.
1Listner(s)listeningtoconnectionevent
ProgramEnded.
varevents=require('events');
vareventEmitter=newevents.EventEmitter();
//-----
varconnectHandler=functionconnected(){
console.log('connectionsuccesful.');
eventEmitter.emit('data_received');
}
//-----
eventEmitter.on('connection',connectHandler);
eventEmitter.on('data_received',function(){console.log('datareceivedsuccesfully.'
//-----
eventEmitter.emit('connection');
console.log("ProgramEnded.");
$>nodeex-03-event1.js
connectionsuccesful.
datareceivedsuccesfully.
ProgramEnded.
varevents=require('events');
vareventEmitter=newevents.EventEmitter();
//-----------
varlistner1=functionlistner1(){console.log('listner1exe
varlistner2=functionlistner2(){console.log('listner2exe
//-----------
eventEmitter.addListener('connection',listner1);
eventEmitter.on('connection',listner2);
//-----------
vareventListeners=require('events').EventEmitter.listenerCo
console.log(eventListeners+"Listner(s)listeningtoconnect
eventEmitter.emit('connection');
//-----------
eventEmitter.removeListener('connection',listner1);
console.log("Listner1willnotlistennow.");
eventEmitter.emit('connection');
eventListeners=require('events').EventEmitter.listenerCount(
console.log(eventListeners+"Listner(s)listeningtoconnect
//-----------
console.log("ProgramEnded.");
16 / 30
Example #4
http server & client
$>nodeex-04-server.js
Serverrunningathttp://127.0.0.1:7070/
Requestfor/ex-04-index.htmlreceived.
server.js
varhttp=require('http');
varfs=require('fs');
varurl=require('url');
http.createServer(function(request,response){
varpathname=url.parse(request.url).pathname;
console.log("Requestfor"+pathname+"received.");
fs.readFile(pathname.substr(1),function(err,data){
if(err){
console.log(err);
response.writeHead(404,{'Content-Type':'text/html'
}else{
response.writeHead(200,{'Content-Type':'text/html'
response.write(data.toString());
}
response.end();
});
}).listen(7070);
console.log('Serverrunningathttp://127.0.0.1:7070/');
17 / 30
varhttp=require('http');
varoptions={
host:'localhost',
port:'7070',
path:'/ex-04-index.html'
};
varcallback=function(response){
varbody='';
response.on('data',function(data){
body+=data;
});
response.on('end',function(){
console.log(body);
});
}
varreq=http.request(options,callback);
req.end();
Example #4
http server & client
$>nodeex-04-client.js
<html>
<head>
<title>SamplePage</title>
</head>
<body>
<h1>HelloWorld!</h1>
</body>
</html>
18 / 30
Example #5 (Stream)
$>nodeex-05-rwstream1.js
ProgramEnded
iniinputiniinputiniinput
inputiniinputini
inputinputinput
varfs=require("fs");
vardata='';
varreaderStream=fs.createReadStream('ex-05-input.txt');
readerStream.setEncoding('UTF8');
//--------
readerStream.on('data',function(chunk){data+=chunk;});
readerStream.on('end',function(){console.log(data);});
readerStream.on('error',function(err){console.log(err.stack);});
//--------
console.log("ProgramEnded");
$>nodeex-05-rwstream2.js
ProgramEnded
Writecompleted.
varfs=require("fs");
vardata='datainputdatainputdata';
varwriterStream=fs.createWriteStream('ex-05-output.txt');
writerStream.write(data,'UTF8');
writerStream.end();
//------------
writerStream.on('finish',function(){console.log("Writecomp
writerStream.on('error',function(err){console.log(err.stack)
//------------
console.log("ProgramEnded");
19 / 30
Example #5
varfs=require("fs");
varreaderStream=fs.createReadStream('ex-05-input.txt');
varwriterStream=fs.createWriteStream('ex-05-output-2.txt'
readerStream.pipe(writerStream);
console.log("ProgramEnded");
varfs=require("fs");
varzlib=require('zlib');
//----------------
fs.createReadStream('ex-05-input.txt')
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream('ex-05-input.txt.gz'));
console.log("FileCompressed.");
//----------------
//needsync(callbackafterwritegz)
fs.createReadStream('ex-05-input.txt.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('ex-05-input-recovered.txt'));
console.log("FileDecompressed.");
20 / 30
$>nodeex-06.js
endianness:LE
type:Windows_NT
platform:win32
totalmemory:6097141760bytes.
freememory:3529269248bytes.
varos=require("os");
console.log('endianness:'+os.endianness());
console.log('type:'+os.type());
console.log('platform:'+os.platform());
console.log('totalmemory:'+os.totalmem()+"bytes.");
console.log('freememory:'+os.freemem()+"bytes.");
Example #6 (os)
21 / 30
Example #7 (path)
$>nodeex-07.js
normalization:testtest12slashes1slash
jointpath:testtest12slashes1slash
resolve:H:nodejs-5.2.0workbasicsex-06.js
extname:.js
varpath=require("path");
console.log('normalization:'+path.normalize('/test/test1//
console.log('jointpath:'+path.join('/test','test1','2sl
console.log('resolve:'+path.resolve('ex-06.js'));
console.log('extname:'+path.extname('ex-06.js'));
22 / 30
vardns=require('dns');
dns.lookup('www.google.com',functiononLookup(err,address,family)
console.log('address:',address);
dns.reverse(address,function(err,hostnames){
if(err){
console.log(err.stack);
}
console.log('reversefor'+address+':'+JSON.stringify(hostnames));
});
});
$>nodeex-08.js
address:111.94.248.59
reversefor111.94.248.59:["fm-dyn-111-94-248-59.fast.net.id"
Example #8 (dns)
23 / 30
Example #9 (domain)
$>nodeex-09.js
listenerhandledthiserror(Tobehandledbylistener)
domain1handledthiserror(Tobehandledbydomain1)
domain2handledthiserror(Tobehandledbydomain2)
varEventEmitter=require("events").EventEmitter;
vardomain=require("domain");
varemitter1=newEventEmitter();
vardomain1 =domain.create();
//--------------uselistener
domain1.on('error',function(err){console.log("domain1handle
domain1.add(emitter1);
emitter1.on('error',function(err){console.log("listenerhandl
emitter1.emit('error',newError('Tobehandledbylistener'));
//--------------removelistener
emitter1.removeAllListeners('error');
emitter1.emit('error',newError('Tobehandledbydomain1'));
//--------------uncaught
//domain1.remove(emitter1);
//emitter1.emit('error',newError('Convertedtoexception.S
//--------------
//--------------
vardomain2=domain.create();
domain2.on('error',function(err){console.log("domain2handle
domain2.run(function(){
varemitter2=newEventEmitter();
emitter2.emit('error',newError('Tobehandledbydomain2'
});
24 / 30
console.log(__filename);
console.log(__dirname);
//------------
functionprintHello(){console.log("Hello,World!");}
setTimeout(printHello,2000); //callafter2seconds
//setInterval(printHello,2000);//repeat
vart=setTimeout(printHello,2000);
clearTimeout(t);//stopthetimer,notexecuted
//------------
console.info("ProgramStarted");
varcounter=10;
console.log("Counter:%d",counter);
console.time("Gettingdata");
//Dosomeprocessinghere...
console.timeEnd('Gettingdata');
console.info("ProgramEnded")
$>nodeex-10-misc1.js
H:nodejs-5.2.0workbasicsex-10-misc1.js
H:nodejs-5.2.0workbasics
ProgramStarted
Counter:10
Gettingdata:0.626ms
ProgramEnded
Hello,World!
Example #10 (misc)
25 / 30
Example #10 (misc)
$>nodeex-10-misc2.js
ProgramStarted
HelloWorld!
0:H:nodejs-5.2.0node.exe
1:H:nodejs-5.2.0workbasicsex-10-misc2.js
H:nodejs-5.2.0node.exe
win32
Currentdirectory:H:nodejs-5.2.0workbasics
Currentversion:v5.2.0
{rss:17371136,heapTotal:7524096,heapUsed:4050072}
Abouttoexitwithcode:0
process.on('exit',function(code){
//Followingcodewillneverexecute.
setTimeout(function(){console.log("Thiswillnotrun");},
console.log('Abouttoexitwithcode:',code);
});
console.log("ProgramStarted");
//------------
process.stdout.write("HelloWorld!"+"n");
//Readingpassedparameter
process.argv.forEach(function(val,index,array){console.log
//------------
console.log(process.execPath);
console.log(process.platform);
console.log('Currentdirectory:'+process.cwd());
console.log('Currentversion:'+process.version);
console.log(process.memoryUsage());
26 / 30
buf=newBuffer(256);
len=buf.write("SimplyEasyLearning");
console.log("Octetswritten:"+ len);
//---------------
buf=newBuffer(26);
for(vari=0;i<26;i++){buf[i]=i+97;}
console.log(buf.toString('ascii')); //outputs:abcdefghijklmnopqrstuvwxyz
console.log(buf.toString('ascii',0,5)); //outputs:abcde
console.log(buf.toString('utf8',0,5)); //outputs:abcde
console.log(buf.toString(undefined,0,5));//encodingdefaultsto'utf8',outputsabcde
//---------------
varbuf=newBuffer('SimplyEasyLearning');
varjson=buf.toJSON(buf);
console.log(json);
$>nodeex-11-buf1.js
Octetswritten:20
abcdefghijklmnopqrstuvwxyz
abcde
abcde
abcde
{type:'Buffer',
data:
[83,105,109,112,108,121,32,69,97,115,121,32,
Example #11 (Buffer)
27 / 30
Example #11 (Buffer)
$>nodeex-11-buf2.js
buffer3content:TutorialsPointSimplyEasyLearning
ABCcomesbeforeABCD
buffer2content:ABC
buffer2content:Tutorials
bufferlength:14
varbuffer1=newBuffer('TutorialsPoint');
varbuffer2=newBuffer('SimplyEasyLearning');
varbuffer3=Buffer.concat([buffer1,buffer2]);
console.log("buffer3content:"+buffer3.toString());
//---------------
varbuffer1=newBuffer('ABC');
varbuffer2=newBuffer('ABCD');
varresult=buffer1.compare(buffer2);
if(result<0){console.log(buffer1+"comesbefore"+buffe
elseif(result==0){console.log(buffer1+"issameas"+bu
else{console.log(buffer1+"comesafter"+buffer2);}
//---------------
varbuffer1=newBuffer('ABC');
varbuffer2=newBuffer(3);
buffer1.copy(buffer2);//copyabuffer
console.log("buffer2content:"+buffer2.toString());
//---------------
varbuffer1=newBuffer('TutorialsPoint');
varbuffer2=buffer1.slice(0,9);//slicingabuffer
console.log("buffer2content:"+buffer2.toString());
//---------------
varbuffer=newBuffer('TutorialsPoint');
console.log("bufferlength:"+buffer.length);//lengthofth
28 / 30
References
1. Guides | Node.js
2. Node.js Tutorial - TutorialsPoint
3. Simple Servers | Node.js | Bevry's Learning Centre
29 / 30

END
Eueung Mulyana
http://eueung.github.io/js/node-basics
JS CodeLabs | Attribution-ShareAlike CC BY-SA
30 / 30

Introduction to Node.JS