SlideShare a Scribd company logo
Node.js
Threads – Modules - Callbacks
2
Threads versus Events
request = readRequest(socket);
reply = processRequest(request);
sendReply(socket, reply);
Implementation:
- Thread switching and scheduler
readRequest(socket, function(request) {
processRequest(request,
function (reply) {
sendReply(socket, reply);
});
});
Implementation:
- Event queue processing
3
Event queue
while (true) {
if (!eventQueue.notEmpty()) {
eventQueue.pop().call();
}
}
Inner loop
1. launchReadRequest(socket); // Returns immediately
2. eventQueue.push(readDoneEventHandler); // when readRequest is complete
Never wait/block in event handler [ex: readRequest(socket);]
4
Node.js
● Takes JavaScript engine from a browser (Chrome's V8 JavaScript Engine)
○ Get same JavaScript on both browser and server
○ Don't need the DOM on the server
● Adds events and an event queue
○ Everything runs as a call from the event loop
● Makes event interface to all OS operations
○ Wrap all the OS blocking calls (file and socket/network io)
○ Add some data handle support
● Adds a proper module system
○ Each module gets its own scope (not everything in document.window)
5
Example: Node.js callback
var fs = require("fs"); // require is a Node module call
// fs object wraps OS sync file system calls
// OS read() is synchronous but Node's fs.readFile is asynchronous
fs.readFile("smallFile", readDoneCallback); // Start read
function readDoneCallback(error, dataBuffer) {
// By convention: First argument is JavaScript Error object
// dataBuffer is a special Node Buffer object
if (!error) {
console.log("smallFile contents", dataBuffer.toString());
}
}
6
Node Modules
var notGlobal;
function func1() {}
function func2() {}
module.exports = {func1: func1, func2: func2};
● Import using require()
○ System module: require("fs"); // Looks in node_module directories
○ From a file: require("./XXX.js"); // Reads specified file
○ From a directory: require("./myModule"); // Reads myModule/index.js
● Module files have a private scope
○ Can declare variables that would be global in the browser
○ Require returns what is assigned to module.exports
7
Node modules
● Many standard Node modules
○ File system, process access, networking, timers, devices, crypto, etc.
● Huge library of modules (npm)
○ Do pretty much anything you want
● We use:
○ Express - Fast, unopinionated, minimalist web framework (speak HTTP)
○ Mongoose - Elegant mongodb object modeling (speak to the database)
8
Node Buffer class
● Manipulating lots of binary data wasn't a strength of the JavaScript engine
○ Of course, that is what web servers do:
DBMS ⇔ Web Server ⇔ Browser
● Node added a Buffer class - Optimized for storing and operating on
binary data
○ Interface looks an array of bytes (like the OS system calls use)
○ Memory is allocated outside of the V8 heap
● Used by the “wrapped” OS I/O calls (fs, net, …)
● Thus optimizing sharing with pointers rather than always copying
○ buffer.copy()
○ For example: socket.write instead of fs.readFile
9
Buffer operations
● Supports operations for selecting or updating certain values
○ Can peek at some values and send the bulk of it on its way
● Can convert a buffer or parts of a buffer to a JavaScript string
○ buf.toString("utf8"); // Convert to UTF8 - commonly used on the web
○ buf.toString("hex"); // Convert to hex encoding (2 digits per byte)
○ buf.toString("base64"); // Convert to base64 encoding
10
Example: Node.js callbacks (redux)
var fs = require("fs");
// fs has 81 properties: readFile, writeFile, most OS calls, etc.
fs.readFile("smallFile", readDoneCallback);
// Read has been launched - JavaScript execution continues
// Node.js exits when no callbacks are outstanding
function readDoneCallback(error, dataBuffer) {
// console.log(dataBuffer) prints <Buffer 66 73 20 3d 20 72 65 71 ...
if (!error) {
console.log("smallFile contents", dataBuffer.toString());
}
}
11
Programming with Events/Callbacks
r1 = step1();
console.log('step1 done', r1);
r2 = step2(r1);
console.log('step2 done', r2);
r3 = step3(r2);
console.log('step3 done', r3);
console.log('All Done!');
● Threads: Blocking/waiting is transparent
● Events: Blocking/waiting requires callback
step1(function(r1) {
console.log('step1 done', r1);
step2(r1, function (r2) {
console.log('step2 done', r2);
step3(r2, function (r3) {
console.log('step3 done',r3);
});
});
}):
THREADS EVENTS
12
Programming with Events/Callbacks
● Key difference
○ Threads: Blocking/waiting is transparent
○ Events: Blocking/waiting requires callback
● Mental model
○ If code doesn't block: Same as thread programming
○ If code does block (or needs to block): Need to setup callback
○ Often what was a return statement becomes a function call
13
Example: Three step process(broken)
step1(function(r1) {
console.log('step1 done', r1);
step2(r1, function (r2) {
console.log('step2 done', r2);
step3(r2, function (r3) {
console.log('step3 done',r3);
});
});
}):
console.log('All Done!');
// Won't work! Call outside scope!
THREADS (or non-blocking) CALLBACKS
r1 = step1();
console.log('step1 done', r1);
r2 = step2(r1);
console.log('step2 done', r2);
r3 = step3(r2);
console.log('step3 done', r3);
console.log('All Done!');
14
Example: Three-step process(repaired)
step1(function(r1) {
console.log('step1 done', r1);
step2(r1, function (r2) {
console.log('step2 done', r2);
step3(r2, function (r3) {
console.log('step3 done',r3);
console.log('All Done!');
});
});
}):
EVENTS
r1 = step1();
console.log('step1 done', r1);
r2 = step2(r1);
console.log('step2 done', r2);
r3 = step3(r2);
console.log('step3 done', r3);
console.log('All Done!');
THREADS
15
Listener/emitter pattern
● When programing with events (rather than threads) a
listener/emitter pattern is used.
● Listener - Function to be called when the event is signaled
○ Should be familiar from DOM programming
(addEventListerner)
● Emitter - Signal that an event has occurred
○ Emit an event cause all the listener functions to be called
16
Node: EventEmitter = require('events');
myEmitter.on('myEvent', function(param1, param2) {
console.log('myEvent occurred with ' + param1 + ' and ' + param2 + '!');
});
myEmitter.emit('myEvent', 'arg1', 'arg2');
● On emit call listeners are called synchronously and in the
order the listeners were registered
● If no listener, then emit() is non-operative
● Listen with on() and signal with emit()
17
Typical EventEmitter patterns
myEmitter.on('conditionA', doConditionA);
myEmitter.on('conditionB', doConditionB);
myEmitter.on('conditionC', doConditionC);
myEmitter.on('error', handleErrorCondition);
● Handling 'error' exceptions is important - Node exits if
they are not caught!
● Have multiple different events for different state or actions
myEmitter.emit('error', new Error('Ouch!'));
18
Streams
● Build modules that produce and/or consume streams of data
● A popular way of structuring servers
○ Network socket ⇔ TCP/IP protocol processing ⇔ HTTP protocol processing ⇔ your code
● Can build connected streams dynamically
○ Add modules on stream: E.g. stream.push(Encryption)
Network socket ⇔ TCP/IP protocol processing ⇔ Encryption ⇔ HTTP processing
● Node's APIs heavily uses streams
○ Readable streams (e.g. fs.createReadStream)
○ Writable stream (e.g. fs.createWriteStream)
○ Duplex stream (e.g. net.createConnection)
○ Transform stream (e.g. zlib, crypto)
19
Readable streams - File reading using streams
var readableStreamEvent = fs.createReadStream("smallFile");
readableStreamEvent.on('data', function (chunkBuffer) {
// Could be called multiple times
console.log('got chunk of', chunkBuffer.length, 'bytes');
});
readableStreamEvent.on('end', function() {
// Called after all chunks read
console.log('got all the data');
});
readableStreamEvent.on('error', function (err) {
console.error('got error', err);
});
20
Writable streams - File writing using streams
var writableStreamEvent = fs.createWriteStream('outputFile');
writableStreamEvent.on('finish', function () {
console.log('file has been written!');
});
writableStreamEvent.write('Hello world!n');
writableStreamEvent.end();
21
Socket setup for TCP connections
sock = socket(AF_INET, SOCK_STREAM,
0);
connect(sock, &serverAddr,
sizeof(serverAddr));
write(sock, "Hi!", 3);
read(sock, buf, 3)
Server (Web Server)
lfd = socket(AF_INET, SOCK_STREAM, 0);
bind(lfd, &serverSddr, sizeof(serveraddr));
listen(lfd, 5);
sock = accept(lgf, &clientaddr, &clientlen);
read(sock, buf, 3);
write(sock, buf, 3)
Client (Browser)
● TCP/IP socket connection is a reliable, in-order byte stream
○ Node: reads can return data in different chunks that sent
22
TCP Networking on Node.js
var net = require('net');
net.createServer(processTCPconnection).listen(4000);
// Creates a socket, binds port 4000, and listens for connections
// Calls function processTCPconnection on each TCP connection
● Node net module wraps OS's network routines
● Includes higher level functionality like:
23
Example: A chat server
var clients = []; // List of connected clients
function processTCPconnection(socket) {
clients.push(socket); // Add this client to our connected list
socket.on('data', function (data) {
broadcast( "> " + data, socket); // Send received data to all
});
socket.on('end', function () {
clients.splice(clients.indexOf(socket), 1); // remove socket
});
}
24
Chat Server: broadcast
// Send message to all clients
function broadcast(message, sender) {
clients.forEach(function (client) {
if (client === sender) return;
// Don't send it to sender
client.write(message);
});
}
● Our chat server implementation is done!
25
Putting it together: A real simple file server
net.createServer(function (socket) {
socket.on('data', function (fileName) {
fs.readFile(fileName.toString(), function (error, fileData) {
if (!error) {
socket.write(fileData); // Writing a Buffer
} else {
socket.write(error.message); // Writing a String
}
socket.end();
});
});
}).listen(4000);
26
Example: Read three files
read(open("f1"), buf1, f1Size);
read(open("f2"), buf2, f2Size);
read(open("f3"), buf3, f3Size);
LINUX NODE.JS
// known by some as "Callback
Hell"
fs.readFile("f1", function
(error, data1) {
fs.readFile("f2", function
(error, data2) {
fs.readFile("f3", function
(error, data3) {
});
});
});
27
Example: Read N files(broken)
var fileContents = {};
['f1','f2','f3'].forEach(function (fileName) {
fs.readFile(fileName, function (error, dataBuffer) {
assert(!error);
fileContents[fileName] = dataBuffer;
});
});
If we use fileContents, how do we
know when ALL reads are
completed?
Recall: Can't wait in NodeJS
28
Example: Read N files(fix)
var fileContents = {};
['f1','f2','f3'].forEach(function (fileName) {
fs.readFile(fileName, function (error, dataBuffer) {
assert(!error);
fileContents[fileName] = dataBuffer;
if (gotLastCallBack()) allDoneCallback(fileContents);
});
});
An 'inelegant' solution...
29
Example: Read N files(fix)
var fileContents = {};
async.each(['f1','f2','f3'], readIt, function (err) {
if (!err) console.log('Done'); // fileContents filled in
if (err) console.error('Got an error:', err.message);
});
function readIt(fileName, callback) {
fs.readFile(fileName, function (error, dataBuffer) {
fileContents[fileName] = dataBuffer;
callback(error);
});
}
● Solution: Write a function that turns waiting into a callback
● 'async' to the rescue!
30
Node.JS - many useful built-in modules
● Buffer
● C/C++ Addons
● Child Processes
● Cluster
● Console
● Crypto
● Debugger
● DNS
● Errors
● Events
● File System
● Globals
● Timers
● TLS/SSL
● TTY
● UDP/Datagram
● URL
● Utilities
● V8
● VM
● ZLIB
● HTTP
● HTTPS
● Modules
● Net
● OS
● Path
● Process
● Punycode
● Query Strings
● Readline
● REPL
● Stream
● String Decoder

More Related Content

KEY
Node.js - Best practices
PDF
Preparation for mit ose lab4
PDF
Monitoring with Syslog and EventMachine
ODP
Linux kernel debugging(ODP format)
PDF
Vm ware fuzzing - defcon russia 20
PDF
Zabbix LLD from a C Module by Jan-Piet Mens
PDF
Node day 2014
PDF
App secforum2014 andrivet-cplusplus11-metaprogramming_applied_to_software_obf...
Node.js - Best practices
Preparation for mit ose lab4
Monitoring with Syslog and EventMachine
Linux kernel debugging(ODP format)
Vm ware fuzzing - defcon russia 20
Zabbix LLD from a C Module by Jan-Piet Mens
Node day 2014
App secforum2014 andrivet-cplusplus11-metaprogramming_applied_to_software_obf...

What's hot (20)

PDF
Killing any security product … using a Mimikatz undocumented feature
PDF
Hibernate Import.Sql I18n
PDF
How to make a large C++-code base manageable
PDF
Pf: the OpenBSD packet filter
PDF
Other Approaches (Concurrency)
PDF
Pledge in OpenBSD
PDF
Node.js Event Loop & EventEmitter
PDF
OpenResty TCP 服务代理和动态路由
PDF
Osol Pgsql
PDF
Memory Management of C# with Unity Native Collections
PPTX
Gevent rabbit rpc
ODP
Anyevent
PDF
Cooking pies with Celery
PDF
Linux seccomp(2) vs OpenBSD pledge(2)
PDF
Flowchart - Building next gen malware behavioural analysis environment
PDF
Coroutines in Kotlin. UA Mobile 2017.
PDF
Implementações paralelas
PPTX
Ceph OSD Op trace
PDF
Counter Wars (JEEConf 2016)
PDF
Asynchronous PHP and Real-time Messaging
Killing any security product … using a Mimikatz undocumented feature
Hibernate Import.Sql I18n
How to make a large C++-code base manageable
Pf: the OpenBSD packet filter
Other Approaches (Concurrency)
Pledge in OpenBSD
Node.js Event Loop & EventEmitter
OpenResty TCP 服务代理和动态路由
Osol Pgsql
Memory Management of C# with Unity Native Collections
Gevent rabbit rpc
Anyevent
Cooking pies with Celery
Linux seccomp(2) vs OpenBSD pledge(2)
Flowchart - Building next gen malware behavioural analysis environment
Coroutines in Kotlin. UA Mobile 2017.
Implementações paralelas
Ceph OSD Op trace
Counter Wars (JEEConf 2016)
Asynchronous PHP and Real-time Messaging
Ad

Similar to Node js lecture (20)

PDF
NodeJSnodesforfreeinmyworldgipsnndnnd.pdf
PDF
Original slides from Ryan Dahl's NodeJs intro talk
PPT
Nodejs Intro Part One
PPTX
Building and Scaling Node.js Applications
PDF
Multi-core Node.pdf
PPTX
How NOT to write in Node.js
PDF
Dragoncraft Architectural Overview
PDF
soft-shake.ch - Hands on Node.js
PDF
Think Async: Asynchronous Patterns in NodeJS
PPT
Server side JavaScript: going all the way
PDF
NodeJS for Beginner
PDF
Node.js - async for the rest of us.
PDF
Event driven programming -- Node.JS
PDF
MultiThreading-in-system-and-android-logcat-42-.pdf
KEY
Writing robust Node.js applications
PPT
New kid on the block node.js
PPTX
introduction to node.js
PDF
Scalable Socket Server by Aryo
PDF
Book
ODP
Node js
NodeJSnodesforfreeinmyworldgipsnndnnd.pdf
Original slides from Ryan Dahl's NodeJs intro talk
Nodejs Intro Part One
Building and Scaling Node.js Applications
Multi-core Node.pdf
How NOT to write in Node.js
Dragoncraft Architectural Overview
soft-shake.ch - Hands on Node.js
Think Async: Asynchronous Patterns in NodeJS
Server side JavaScript: going all the way
NodeJS for Beginner
Node.js - async for the rest of us.
Event driven programming -- Node.JS
MultiThreading-in-system-and-android-logcat-42-.pdf
Writing robust Node.js applications
New kid on the block node.js
introduction to node.js
Scalable Socket Server by Aryo
Book
Node js
Ad

More from Darryl Sherman (6)

PPT
Java Naming & Directory Services
PDF
Il 01-search engines
PDF
Il 02-search requeststrings
ODP
Python unit testing
ODP
PSD to HTML Conversion
ODP
Angular js filters and directives
Java Naming & Directory Services
Il 01-search engines
Il 02-search requeststrings
Python unit testing
PSD to HTML Conversion
Angular js filters and directives

Recently uploaded (20)

PDF
How to Choose the Right IT Partner for Your Business in Malaysia
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
System and Network Administraation Chapter 3
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PPTX
L1 - Introduction to python Backend.pptx
PDF
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
PDF
Softaken Excel to vCard Converter Software.pdf
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
PPTX
VVF-Customer-Presentation2025-Ver1.9.pptx
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PDF
medical staffing services at VALiNTRY
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PPTX
Reimagine Home Health with the Power of Agentic AI​
PDF
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
PPTX
CHAPTER 2 - PM Management and IT Context
PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PPTX
ai tools demonstartion for schools and inter college
How to Choose the Right IT Partner for Your Business in Malaysia
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
System and Network Administraation Chapter 3
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
L1 - Introduction to python Backend.pptx
EN-Survey-Report-SAP-LeanIX-EA-Insights-2025.pdf
Softaken Excel to vCard Converter Software.pdf
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
VVF-Customer-Presentation2025-Ver1.9.pptx
Design an Analysis of Algorithms I-SECS-1021-03
medical staffing services at VALiNTRY
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
Reimagine Home Health with the Power of Agentic AI​
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
CHAPTER 2 - PM Management and IT Context
How Creative Agencies Leverage Project Management Software.pdf
How to Migrate SBCGlobal Email to Yahoo Easily
ai tools demonstartion for schools and inter college

Node js lecture

  • 2. 2 Threads versus Events request = readRequest(socket); reply = processRequest(request); sendReply(socket, reply); Implementation: - Thread switching and scheduler readRequest(socket, function(request) { processRequest(request, function (reply) { sendReply(socket, reply); }); }); Implementation: - Event queue processing
  • 3. 3 Event queue while (true) { if (!eventQueue.notEmpty()) { eventQueue.pop().call(); } } Inner loop 1. launchReadRequest(socket); // Returns immediately 2. eventQueue.push(readDoneEventHandler); // when readRequest is complete Never wait/block in event handler [ex: readRequest(socket);]
  • 4. 4 Node.js ● Takes JavaScript engine from a browser (Chrome's V8 JavaScript Engine) ○ Get same JavaScript on both browser and server ○ Don't need the DOM on the server ● Adds events and an event queue ○ Everything runs as a call from the event loop ● Makes event interface to all OS operations ○ Wrap all the OS blocking calls (file and socket/network io) ○ Add some data handle support ● Adds a proper module system ○ Each module gets its own scope (not everything in document.window)
  • 5. 5 Example: Node.js callback var fs = require("fs"); // require is a Node module call // fs object wraps OS sync file system calls // OS read() is synchronous but Node's fs.readFile is asynchronous fs.readFile("smallFile", readDoneCallback); // Start read function readDoneCallback(error, dataBuffer) { // By convention: First argument is JavaScript Error object // dataBuffer is a special Node Buffer object if (!error) { console.log("smallFile contents", dataBuffer.toString()); } }
  • 6. 6 Node Modules var notGlobal; function func1() {} function func2() {} module.exports = {func1: func1, func2: func2}; ● Import using require() ○ System module: require("fs"); // Looks in node_module directories ○ From a file: require("./XXX.js"); // Reads specified file ○ From a directory: require("./myModule"); // Reads myModule/index.js ● Module files have a private scope ○ Can declare variables that would be global in the browser ○ Require returns what is assigned to module.exports
  • 7. 7 Node modules ● Many standard Node modules ○ File system, process access, networking, timers, devices, crypto, etc. ● Huge library of modules (npm) ○ Do pretty much anything you want ● We use: ○ Express - Fast, unopinionated, minimalist web framework (speak HTTP) ○ Mongoose - Elegant mongodb object modeling (speak to the database)
  • 8. 8 Node Buffer class ● Manipulating lots of binary data wasn't a strength of the JavaScript engine ○ Of course, that is what web servers do: DBMS ⇔ Web Server ⇔ Browser ● Node added a Buffer class - Optimized for storing and operating on binary data ○ Interface looks an array of bytes (like the OS system calls use) ○ Memory is allocated outside of the V8 heap ● Used by the “wrapped” OS I/O calls (fs, net, …) ● Thus optimizing sharing with pointers rather than always copying ○ buffer.copy() ○ For example: socket.write instead of fs.readFile
  • 9. 9 Buffer operations ● Supports operations for selecting or updating certain values ○ Can peek at some values and send the bulk of it on its way ● Can convert a buffer or parts of a buffer to a JavaScript string ○ buf.toString("utf8"); // Convert to UTF8 - commonly used on the web ○ buf.toString("hex"); // Convert to hex encoding (2 digits per byte) ○ buf.toString("base64"); // Convert to base64 encoding
  • 10. 10 Example: Node.js callbacks (redux) var fs = require("fs"); // fs has 81 properties: readFile, writeFile, most OS calls, etc. fs.readFile("smallFile", readDoneCallback); // Read has been launched - JavaScript execution continues // Node.js exits when no callbacks are outstanding function readDoneCallback(error, dataBuffer) { // console.log(dataBuffer) prints <Buffer 66 73 20 3d 20 72 65 71 ... if (!error) { console.log("smallFile contents", dataBuffer.toString()); } }
  • 11. 11 Programming with Events/Callbacks r1 = step1(); console.log('step1 done', r1); r2 = step2(r1); console.log('step2 done', r2); r3 = step3(r2); console.log('step3 done', r3); console.log('All Done!'); ● Threads: Blocking/waiting is transparent ● Events: Blocking/waiting requires callback step1(function(r1) { console.log('step1 done', r1); step2(r1, function (r2) { console.log('step2 done', r2); step3(r2, function (r3) { console.log('step3 done',r3); }); }); }): THREADS EVENTS
  • 12. 12 Programming with Events/Callbacks ● Key difference ○ Threads: Blocking/waiting is transparent ○ Events: Blocking/waiting requires callback ● Mental model ○ If code doesn't block: Same as thread programming ○ If code does block (or needs to block): Need to setup callback ○ Often what was a return statement becomes a function call
  • 13. 13 Example: Three step process(broken) step1(function(r1) { console.log('step1 done', r1); step2(r1, function (r2) { console.log('step2 done', r2); step3(r2, function (r3) { console.log('step3 done',r3); }); }); }): console.log('All Done!'); // Won't work! Call outside scope! THREADS (or non-blocking) CALLBACKS r1 = step1(); console.log('step1 done', r1); r2 = step2(r1); console.log('step2 done', r2); r3 = step3(r2); console.log('step3 done', r3); console.log('All Done!');
  • 14. 14 Example: Three-step process(repaired) step1(function(r1) { console.log('step1 done', r1); step2(r1, function (r2) { console.log('step2 done', r2); step3(r2, function (r3) { console.log('step3 done',r3); console.log('All Done!'); }); }); }): EVENTS r1 = step1(); console.log('step1 done', r1); r2 = step2(r1); console.log('step2 done', r2); r3 = step3(r2); console.log('step3 done', r3); console.log('All Done!'); THREADS
  • 15. 15 Listener/emitter pattern ● When programing with events (rather than threads) a listener/emitter pattern is used. ● Listener - Function to be called when the event is signaled ○ Should be familiar from DOM programming (addEventListerner) ● Emitter - Signal that an event has occurred ○ Emit an event cause all the listener functions to be called
  • 16. 16 Node: EventEmitter = require('events'); myEmitter.on('myEvent', function(param1, param2) { console.log('myEvent occurred with ' + param1 + ' and ' + param2 + '!'); }); myEmitter.emit('myEvent', 'arg1', 'arg2'); ● On emit call listeners are called synchronously and in the order the listeners were registered ● If no listener, then emit() is non-operative ● Listen with on() and signal with emit()
  • 17. 17 Typical EventEmitter patterns myEmitter.on('conditionA', doConditionA); myEmitter.on('conditionB', doConditionB); myEmitter.on('conditionC', doConditionC); myEmitter.on('error', handleErrorCondition); ● Handling 'error' exceptions is important - Node exits if they are not caught! ● Have multiple different events for different state or actions myEmitter.emit('error', new Error('Ouch!'));
  • 18. 18 Streams ● Build modules that produce and/or consume streams of data ● A popular way of structuring servers ○ Network socket ⇔ TCP/IP protocol processing ⇔ HTTP protocol processing ⇔ your code ● Can build connected streams dynamically ○ Add modules on stream: E.g. stream.push(Encryption) Network socket ⇔ TCP/IP protocol processing ⇔ Encryption ⇔ HTTP processing ● Node's APIs heavily uses streams ○ Readable streams (e.g. fs.createReadStream) ○ Writable stream (e.g. fs.createWriteStream) ○ Duplex stream (e.g. net.createConnection) ○ Transform stream (e.g. zlib, crypto)
  • 19. 19 Readable streams - File reading using streams var readableStreamEvent = fs.createReadStream("smallFile"); readableStreamEvent.on('data', function (chunkBuffer) { // Could be called multiple times console.log('got chunk of', chunkBuffer.length, 'bytes'); }); readableStreamEvent.on('end', function() { // Called after all chunks read console.log('got all the data'); }); readableStreamEvent.on('error', function (err) { console.error('got error', err); });
  • 20. 20 Writable streams - File writing using streams var writableStreamEvent = fs.createWriteStream('outputFile'); writableStreamEvent.on('finish', function () { console.log('file has been written!'); }); writableStreamEvent.write('Hello world!n'); writableStreamEvent.end();
  • 21. 21 Socket setup for TCP connections sock = socket(AF_INET, SOCK_STREAM, 0); connect(sock, &serverAddr, sizeof(serverAddr)); write(sock, "Hi!", 3); read(sock, buf, 3) Server (Web Server) lfd = socket(AF_INET, SOCK_STREAM, 0); bind(lfd, &serverSddr, sizeof(serveraddr)); listen(lfd, 5); sock = accept(lgf, &clientaddr, &clientlen); read(sock, buf, 3); write(sock, buf, 3) Client (Browser) ● TCP/IP socket connection is a reliable, in-order byte stream ○ Node: reads can return data in different chunks that sent
  • 22. 22 TCP Networking on Node.js var net = require('net'); net.createServer(processTCPconnection).listen(4000); // Creates a socket, binds port 4000, and listens for connections // Calls function processTCPconnection on each TCP connection ● Node net module wraps OS's network routines ● Includes higher level functionality like:
  • 23. 23 Example: A chat server var clients = []; // List of connected clients function processTCPconnection(socket) { clients.push(socket); // Add this client to our connected list socket.on('data', function (data) { broadcast( "> " + data, socket); // Send received data to all }); socket.on('end', function () { clients.splice(clients.indexOf(socket), 1); // remove socket }); }
  • 24. 24 Chat Server: broadcast // Send message to all clients function broadcast(message, sender) { clients.forEach(function (client) { if (client === sender) return; // Don't send it to sender client.write(message); }); } ● Our chat server implementation is done!
  • 25. 25 Putting it together: A real simple file server net.createServer(function (socket) { socket.on('data', function (fileName) { fs.readFile(fileName.toString(), function (error, fileData) { if (!error) { socket.write(fileData); // Writing a Buffer } else { socket.write(error.message); // Writing a String } socket.end(); }); }); }).listen(4000);
  • 26. 26 Example: Read three files read(open("f1"), buf1, f1Size); read(open("f2"), buf2, f2Size); read(open("f3"), buf3, f3Size); LINUX NODE.JS // known by some as "Callback Hell" fs.readFile("f1", function (error, data1) { fs.readFile("f2", function (error, data2) { fs.readFile("f3", function (error, data3) { }); }); });
  • 27. 27 Example: Read N files(broken) var fileContents = {}; ['f1','f2','f3'].forEach(function (fileName) { fs.readFile(fileName, function (error, dataBuffer) { assert(!error); fileContents[fileName] = dataBuffer; }); }); If we use fileContents, how do we know when ALL reads are completed? Recall: Can't wait in NodeJS
  • 28. 28 Example: Read N files(fix) var fileContents = {}; ['f1','f2','f3'].forEach(function (fileName) { fs.readFile(fileName, function (error, dataBuffer) { assert(!error); fileContents[fileName] = dataBuffer; if (gotLastCallBack()) allDoneCallback(fileContents); }); }); An 'inelegant' solution...
  • 29. 29 Example: Read N files(fix) var fileContents = {}; async.each(['f1','f2','f3'], readIt, function (err) { if (!err) console.log('Done'); // fileContents filled in if (err) console.error('Got an error:', err.message); }); function readIt(fileName, callback) { fs.readFile(fileName, function (error, dataBuffer) { fileContents[fileName] = dataBuffer; callback(error); }); } ● Solution: Write a function that turns waiting into a callback ● 'async' to the rescue!
  • 30. 30 Node.JS - many useful built-in modules ● Buffer ● C/C++ Addons ● Child Processes ● Cluster ● Console ● Crypto ● Debugger ● DNS ● Errors ● Events ● File System ● Globals ● Timers ● TLS/SSL ● TTY ● UDP/Datagram ● URL ● Utilities ● V8 ● VM ● ZLIB ● HTTP ● HTTPS ● Modules ● Net ● OS ● Path ● Process ● Punycode ● Query Strings ● Readline ● REPL ● Stream ● String Decoder