SlideShare ist ein Scribd-Unternehmen logo
1 von 30
Downloaden Sie, um offline zu lesen
CS142 Lecture Notes - Node.js
Node.js
Mendel Rosenblum
CS142 Lecture Notes - Node.js
Threads versus Events
request = readRequest(socket);
reply = processRequest(request);
sendReply(socket, reply);
Implementation:
Thread switching (i.e. blocking) and a
scheduler
startRequest(socket);
listen("requestAvail", processRequest);
listen("processDone", sendReplyToSock);
Implementation:
Event queue processing
CS142 Lecture Notes - Node.js
Threads versus Events using Callbacks
request = readRequest(socket);
reply = processRequest(request);
sendReply(socket, reply);
Implementation:
Thread switching (i.e. blocking) and a
scheduler
readRequest(socket, function(request) {
processRequest(request,
function (reply) {
sendReply(socket, reply);
});
});
Implementation:
Event queue processing
CS142 Lecture Notes - Node.js
Event queue
● Inner loop
while (true) {
if (!eventQueue.notEmpty()) {
eventQueue.pop().call();
}
}
● Never wait/block in event handler . Example readRequest(socket);
1. launchReadRequest(socket); // Returns immediately
2. When read finishes: eventQueue.push(readDoneEventHandler);
CS142 Lecture Notes - Node.js
Node.js
● Take a 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
● Include DOM-like events and an event queue
○ Everything runs as a call from the event loop (already had one for browser events)
● Make event interface to all OS operations
○ Wrap all the OS blocking calls (file and socket/network io)
○ Add some data handle support
● Add a proper module system (predated import/export)
○ Each module gets its own scope (not everything in window)
CS142 Lecture Notes - Node.js
Example: Node.js reading a file
let 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) {
// Node callback convention: First argument is JavaScript Error object
// dataBuffer is a special Node Buffer object
if (!error) {
console.log("smallFile contents", dataBuffer.toString());
}
}
CS142 Lecture Notes - Node.js
Node Modules
● Import using require() - Can use ES6 import if file name *.mjs
○ System module: require("fs"); // Looks in node_modules 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
var notGlobal;
function func1() {}
function func2() {}
module.exports = {func1: func1, func2: func2};
CS142 Lecture Notes - Node.js
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)
CS142 Lecture Notes - Node.js
Node Buffer class
● Manipulating lots of binary data wasn't a strength of the JavaScript engine
○ Unfortunately that is what web servers do: DBMS ⇔ Web Server ⇔ Browser
● Node add 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, …)
● Optimized sharing with pointers rather than always copying
○ buffer.copy()
○ For example: fs.readFile to socket.write
CS142 Lecture Notes - Node.js
Buffer operations
● Supports operations for picking values out or updating them
○ 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
CS142 Lecture Notes - Node.js
Example: Node.js reading a file (redux)
let fs = require("fs");
// fs has 81 properties readFile, writeFile, most OS calls, etc.
fs.readFile("smallFile", readDoneCallback); // Start read
// 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());
}
}
CS142 Lecture Notes - Node.js
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
CS142 Lecture Notes - Node.js
Example: Three step process
Threads
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!');
Works for non-blocking
calls in both styles
Callbacks
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!'); // Wrong!
CS142 Lecture Notes - Node.js
Example: Three step process
Threads
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!');
Callbacks
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!');
});
});
});
CS142 Lecture Notes - Node.js
Listener/emitter pattern
● When programing with events (rather than threads) a listener/emitter pattern
is often 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
CS142 Lecture Notes - Node.js
Node: EventEmitter = require('events');
● Listen with on() and signal with emit()
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 a nop
CS142 Lecture Notes - Node.js
Typical EventEmitter patterns
● Have multiple different events for different state or actions
myEmitter.on('conditionA', doConditionA);
myEmitter.on('conditionB', doConditionB);
myEmitter.on('conditionC', doConditionC);
myEmitter.on('error', handleErrorCondition);
● Handling 'error' is important - Node exits if not caught!
myEmitter.emit('error', new Error('Ouch!'));
CS142 Lecture Notes - Node.js
Streams
● Build modules that produce and/or consume streams of data
● A popular way of structuring servers
○ Network interface ⇔ TCP/IP protocol processing ⇔ HTTP protocol processing ⇔ your code
● Can build connected streams dynamically
○ Add modules on stream: E.g. stream.push(Encryption)
Network interface ⇔ 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)
CS142 Lecture Notes - Node.js
Readable streams - File reading using streams
var readableStreamEvent = fs.createReadStream("bigFile");
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);
});
CS142 Lecture Notes - Node.js
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();
// Don't forget writableStreamEvent.on('error', …..
CS142 Lecture Notes - Node.js
Digression: Socket setup for TCP connections
Client (Browser)
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, &serverAddr, sizeof(serveraddr));
listen(lfd, 5);
sock = accept(lfd, &clientaddr, &clientlen);
read(sock, buf, 3);
write(sock, buf, 3)
● TCP/IP socket connection is a reliable, in-order byte stream
○ Note: reads can return data in different chunks that sent
CS142 Lecture Notes - Node.js
TCP Networking on Node.js
● Node net module wraps OS's network routines
● Includes higher level functionality like:
let 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
CS142 Lecture Notes - Node.js
Example: A chat server
let 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
});
}
CS142 Lecture Notes - Node.js
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!
CS142 Lecture Notes - Node.js
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);
● Think about concurrency going on here
CS142 Lecture Notes - Node.js
Example: Read three files
● Linux
read(open("f1"), buf1, f1Size);
read(open("f2"), buf2, f2Size);
read(open("f3"), buf3, f3Size);
● Node.js
fs.readFile("f1", function (error, data1) {
fs.readFile("f2", function (error, data2) {
fs.readFile("f3", function (error, data3) {
// Call Pyramid of Doom or Callback Hell
}); }); });
CS142 Lecture Notes - Node.js
Example: Read N files
var fileContents = {};
['f1','f2','f3'].forEach(function (fileName) {
fs.readFile(fileName, function (error, dataBuffer) {
assert(!error);
fileContents[fileName] = dataBuffer;
});
});
If we want to use fileContents how do we know when all reads are finished?
Recall: Can't wait in NodeJS
CS142 Lecture Notes - Node.js
Example: Read N files
var fileContents = {};
['f1','f2','f3'].forEach(function (fileName) {
fs.readFile(fileName, function (error, dataBuffer) {
assert(!error);
fileContents[fileName] = dataBuffer;
if (gotLastCallBack()) allDoneCallback(fileContents);
});
});
● Yuck!
CS142 Lecture Notes - Node.js
Async module: var async = require('async');
● Solution: Write a function that turns waiting into a callback
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);
});
}
CS142 Lecture Notes - Node.js
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

Weitere ähnliche Inhalte

Ähnlich wie NodeJSnodesforfreeinmyworldgipsnndnnd.pdf

Node.js in action
Node.js in actionNode.js in action
Node.js in actionSimon Su
 
Node.js Workshop - Sela SDP 2015
Node.js Workshop  - Sela SDP 2015Node.js Workshop  - Sela SDP 2015
Node.js Workshop - Sela SDP 2015Nir Noy
 
New kid on the block node.js
New kid on the block node.jsNew kid on the block node.js
New kid on the block node.jsJoel Divekar
 
How to make a high-quality Node.js app, Nikita Galkin
How to make a high-quality Node.js app, Nikita GalkinHow to make a high-quality Node.js app, Nikita Galkin
How to make a high-quality Node.js app, Nikita GalkinSigma Software
 
Global objects in Node.pdf
Global objects in Node.pdfGlobal objects in Node.pdf
Global objects in Node.pdfSudhanshiBakre1
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applicationsTom Croucher
 
Linux kernel tracing superpowers in the cloud
Linux kernel tracing superpowers in the cloudLinux kernel tracing superpowers in the cloud
Linux kernel tracing superpowers in the cloudAndrea Righi
 
Building and Scaling Node.js Applications
Building and Scaling Node.js ApplicationsBuilding and Scaling Node.js Applications
Building and Scaling Node.js ApplicationsOhad Kravchick
 
Python twisted
Python twistedPython twisted
Python twistedMahendra M
 
Node.js Course 1 of 2 - Introduction and first steps
Node.js Course 1 of 2 - Introduction and first stepsNode.js Course 1 of 2 - Introduction and first steps
Node.js Course 1 of 2 - Introduction and first stepsManuel Eusebio de Paz Carmona
 
finalprojtemplatev5finalprojtemplate.gitignore# Ignore the b
finalprojtemplatev5finalprojtemplate.gitignore# Ignore the bfinalprojtemplatev5finalprojtemplate.gitignore# Ignore the b
finalprojtemplatev5finalprojtemplate.gitignore# Ignore the bChereCheek752
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksMongoDB
 

Ähnlich wie NodeJSnodesforfreeinmyworldgipsnndnnd.pdf (20)

Node.js in action
Node.js in actionNode.js in action
Node.js in action
 
Node.js Workshop - Sela SDP 2015
Node.js Workshop  - Sela SDP 2015Node.js Workshop  - Sela SDP 2015
Node.js Workshop - Sela SDP 2015
 
Linux Internals - Part II
Linux Internals - Part IILinux Internals - Part II
Linux Internals - Part II
 
Streams in Node.js
Streams in Node.jsStreams in Node.js
Streams in Node.js
 
New kid on the block node.js
New kid on the block node.jsNew kid on the block node.js
New kid on the block node.js
 
How to make a high-quality Node.js app, Nikita Galkin
How to make a high-quality Node.js app, Nikita GalkinHow to make a high-quality Node.js app, Nikita Galkin
How to make a high-quality Node.js app, Nikita Galkin
 
Global objects in Node.pdf
Global objects in Node.pdfGlobal objects in Node.pdf
Global objects in Node.pdf
 
Book
BookBook
Book
 
MyShell - English
MyShell - EnglishMyShell - English
MyShell - English
 
Writing robust Node.js applications
Writing robust Node.js applicationsWriting robust Node.js applications
Writing robust Node.js applications
 
NodeJS for Beginner
NodeJS for BeginnerNodeJS for Beginner
NodeJS for Beginner
 
Linux kernel tracing superpowers in the cloud
Linux kernel tracing superpowers in the cloudLinux kernel tracing superpowers in the cloud
Linux kernel tracing superpowers in the cloud
 
Nodejs Intro Part One
Nodejs Intro Part OneNodejs Intro Part One
Nodejs Intro Part One
 
Building and Scaling Node.js Applications
Building and Scaling Node.js ApplicationsBuilding and Scaling Node.js Applications
Building and Scaling Node.js Applications
 
Python twisted
Python twistedPython twisted
Python twisted
 
Node.js Course 1 of 2 - Introduction and first steps
Node.js Course 1 of 2 - Introduction and first stepsNode.js Course 1 of 2 - Introduction and first steps
Node.js Course 1 of 2 - Introduction and first steps
 
finalprojtemplatev5finalprojtemplate.gitignore# Ignore the b
finalprojtemplatev5finalprojtemplate.gitignore# Ignore the bfinalprojtemplatev5finalprojtemplate.gitignore# Ignore the b
finalprojtemplatev5finalprojtemplate.gitignore# Ignore the b
 
Fun Teaching MongoDB New Tricks
Fun Teaching MongoDB New TricksFun Teaching MongoDB New Tricks
Fun Teaching MongoDB New Tricks
 
Getting Input from User
Getting Input from UserGetting Input from User
Getting Input from User
 
Unit-2 Getting Input from User.pptx
Unit-2 Getting Input from User.pptxUnit-2 Getting Input from User.pptx
Unit-2 Getting Input from User.pptx
 

Kürzlich hochgeladen

Abdulaziz Tariq Abdulaziz Mustafa CV 2024
Abdulaziz Tariq Abdulaziz Mustafa CV 2024Abdulaziz Tariq Abdulaziz Mustafa CV 2024
Abdulaziz Tariq Abdulaziz Mustafa CV 2024Abdulaziz Mustafa
 
NO1 Best Kala Jadu Expert Specialist In Qatar Kala Jadu Expert Specialist In ...
NO1 Best Kala Jadu Expert Specialist In Qatar Kala Jadu Expert Specialist In ...NO1 Best Kala Jadu Expert Specialist In Qatar Kala Jadu Expert Specialist In ...
NO1 Best Kala Jadu Expert Specialist In Qatar Kala Jadu Expert Specialist In ...Amil baba
 
NO1 Best Best Amil In Rawalpindi Bangali Baba In Rawalpindi jadu tona karne w...
NO1 Best Best Amil In Rawalpindi Bangali Baba In Rawalpindi jadu tona karne w...NO1 Best Best Amil In Rawalpindi Bangali Baba In Rawalpindi jadu tona karne w...
NO1 Best Best Amil In Rawalpindi Bangali Baba In Rawalpindi jadu tona karne w...Amil baba
 
FW25-26 Fashion Key Items Trend Book Peclers Paris
FW25-26 Fashion Key Items Trend Book Peclers ParisFW25-26 Fashion Key Items Trend Book Peclers Paris
FW25-26 Fashion Key Items Trend Book Peclers ParisPeclers Paris
 
BIT Khushi gandhi project.pdf graphic design
BIT Khushi gandhi project.pdf graphic designBIT Khushi gandhi project.pdf graphic design
BIT Khushi gandhi project.pdf graphic designKhushiGandhi15
 
一比一原版格林威治大学毕业证成绩单如何办理
一比一原版格林威治大学毕业证成绩单如何办理一比一原版格林威治大学毕业证成绩单如何办理
一比一原版格林威治大学毕业证成绩单如何办理cyebo
 
The Impact of Artificial Intelligence on Modern Healthcare.pptx
The Impact of Artificial Intelligence on Modern Healthcare.pptxThe Impact of Artificial Intelligence on Modern Healthcare.pptx
The Impact of Artificial Intelligence on Modern Healthcare.pptxDoraemon495609
 
Knowing, Understanding and Planning Cities- Role and Relevance Physical Plan...
Knowing, Understanding and Planning Cities- Role and Relevance  Physical Plan...Knowing, Understanding and Planning Cities- Role and Relevance  Physical Plan...
Knowing, Understanding and Planning Cities- Role and Relevance Physical Plan...JIT KUMAR GUPTA
 
Spring 2024 wkrm_Enhancing Campus Mobility.pdf
Spring 2024 wkrm_Enhancing Campus Mobility.pdfSpring 2024 wkrm_Enhancing Campus Mobility.pdf
Spring 2024 wkrm_Enhancing Campus Mobility.pdfJon Freach
 
Week of Action 2022_EIT Climate-KIC_Headers
Week of Action 2022_EIT Climate-KIC_HeadersWeek of Action 2022_EIT Climate-KIC_Headers
Week of Action 2022_EIT Climate-KIC_Headersekinlvnt
 
一比一原版谢菲尔德大学毕业证成绩单如何办理
一比一原版谢菲尔德大学毕业证成绩单如何办理一比一原版谢菲尔德大学毕业证成绩单如何办理
一比一原版谢菲尔德大学毕业证成绩单如何办理cyebo
 
Avoid these common UI/UX design mistakes
 Avoid these common UI/UX design mistakes Avoid these common UI/UX design mistakes
Avoid these common UI/UX design mistakesuistudiozdesign
 
Heuristic Evaluation of System & Application
Heuristic Evaluation of System & ApplicationHeuristic Evaluation of System & Application
Heuristic Evaluation of System & ApplicationJaime Brown
 
Latest Trends in Home and Building Design
Latest Trends in Home and Building DesignLatest Trends in Home and Building Design
Latest Trends in Home and Building DesignResDraft
 
Dos And Dont's Of Logo Design For 2024..
Dos And Dont's Of Logo Design For 2024..Dos And Dont's Of Logo Design For 2024..
Dos And Dont's Of Logo Design For 2024..GB Logo Design
 
spColumn-Manual design column by spcolumn software.pdf
spColumn-Manual design column by spcolumn software.pdfspColumn-Manual design column by spcolumn software.pdf
spColumn-Manual design column by spcolumn software.pdfChan Thorn
 
Evaluating natural frequencies and mode shapes.pptx
Evaluating natural frequencies and mode shapes.pptxEvaluating natural frequencies and mode shapes.pptx
Evaluating natural frequencies and mode shapes.pptxjoshuaclack73
 
Heidi Livengood's Professional CADD Portfolio
Heidi Livengood's Professional CADD PortfolioHeidi Livengood's Professional CADD Portfolio
Heidi Livengood's Professional CADD PortfolioHeidiLivengood
 
Levi's Advertisement and camapign design
Levi's Advertisement and camapign designLevi's Advertisement and camapign design
Levi's Advertisement and camapign designAkankshaD3
 
Recycled Modular Low Cost Construction .pdf
Recycled Modular Low Cost Construction .pdfRecycled Modular Low Cost Construction .pdf
Recycled Modular Low Cost Construction .pdfjeffreycarroll14
 

Kürzlich hochgeladen (20)

Abdulaziz Tariq Abdulaziz Mustafa CV 2024
Abdulaziz Tariq Abdulaziz Mustafa CV 2024Abdulaziz Tariq Abdulaziz Mustafa CV 2024
Abdulaziz Tariq Abdulaziz Mustafa CV 2024
 
NO1 Best Kala Jadu Expert Specialist In Qatar Kala Jadu Expert Specialist In ...
NO1 Best Kala Jadu Expert Specialist In Qatar Kala Jadu Expert Specialist In ...NO1 Best Kala Jadu Expert Specialist In Qatar Kala Jadu Expert Specialist In ...
NO1 Best Kala Jadu Expert Specialist In Qatar Kala Jadu Expert Specialist In ...
 
NO1 Best Best Amil In Rawalpindi Bangali Baba In Rawalpindi jadu tona karne w...
NO1 Best Best Amil In Rawalpindi Bangali Baba In Rawalpindi jadu tona karne w...NO1 Best Best Amil In Rawalpindi Bangali Baba In Rawalpindi jadu tona karne w...
NO1 Best Best Amil In Rawalpindi Bangali Baba In Rawalpindi jadu tona karne w...
 
FW25-26 Fashion Key Items Trend Book Peclers Paris
FW25-26 Fashion Key Items Trend Book Peclers ParisFW25-26 Fashion Key Items Trend Book Peclers Paris
FW25-26 Fashion Key Items Trend Book Peclers Paris
 
BIT Khushi gandhi project.pdf graphic design
BIT Khushi gandhi project.pdf graphic designBIT Khushi gandhi project.pdf graphic design
BIT Khushi gandhi project.pdf graphic design
 
一比一原版格林威治大学毕业证成绩单如何办理
一比一原版格林威治大学毕业证成绩单如何办理一比一原版格林威治大学毕业证成绩单如何办理
一比一原版格林威治大学毕业证成绩单如何办理
 
The Impact of Artificial Intelligence on Modern Healthcare.pptx
The Impact of Artificial Intelligence on Modern Healthcare.pptxThe Impact of Artificial Intelligence on Modern Healthcare.pptx
The Impact of Artificial Intelligence on Modern Healthcare.pptx
 
Knowing, Understanding and Planning Cities- Role and Relevance Physical Plan...
Knowing, Understanding and Planning Cities- Role and Relevance  Physical Plan...Knowing, Understanding and Planning Cities- Role and Relevance  Physical Plan...
Knowing, Understanding and Planning Cities- Role and Relevance Physical Plan...
 
Spring 2024 wkrm_Enhancing Campus Mobility.pdf
Spring 2024 wkrm_Enhancing Campus Mobility.pdfSpring 2024 wkrm_Enhancing Campus Mobility.pdf
Spring 2024 wkrm_Enhancing Campus Mobility.pdf
 
Week of Action 2022_EIT Climate-KIC_Headers
Week of Action 2022_EIT Climate-KIC_HeadersWeek of Action 2022_EIT Climate-KIC_Headers
Week of Action 2022_EIT Climate-KIC_Headers
 
一比一原版谢菲尔德大学毕业证成绩单如何办理
一比一原版谢菲尔德大学毕业证成绩单如何办理一比一原版谢菲尔德大学毕业证成绩单如何办理
一比一原版谢菲尔德大学毕业证成绩单如何办理
 
Avoid these common UI/UX design mistakes
 Avoid these common UI/UX design mistakes Avoid these common UI/UX design mistakes
Avoid these common UI/UX design mistakes
 
Heuristic Evaluation of System & Application
Heuristic Evaluation of System & ApplicationHeuristic Evaluation of System & Application
Heuristic Evaluation of System & Application
 
Latest Trends in Home and Building Design
Latest Trends in Home and Building DesignLatest Trends in Home and Building Design
Latest Trends in Home and Building Design
 
Dos And Dont's Of Logo Design For 2024..
Dos And Dont's Of Logo Design For 2024..Dos And Dont's Of Logo Design For 2024..
Dos And Dont's Of Logo Design For 2024..
 
spColumn-Manual design column by spcolumn software.pdf
spColumn-Manual design column by spcolumn software.pdfspColumn-Manual design column by spcolumn software.pdf
spColumn-Manual design column by spcolumn software.pdf
 
Evaluating natural frequencies and mode shapes.pptx
Evaluating natural frequencies and mode shapes.pptxEvaluating natural frequencies and mode shapes.pptx
Evaluating natural frequencies and mode shapes.pptx
 
Heidi Livengood's Professional CADD Portfolio
Heidi Livengood's Professional CADD PortfolioHeidi Livengood's Professional CADD Portfolio
Heidi Livengood's Professional CADD Portfolio
 
Levi's Advertisement and camapign design
Levi's Advertisement and camapign designLevi's Advertisement and camapign design
Levi's Advertisement and camapign design
 
Recycled Modular Low Cost Construction .pdf
Recycled Modular Low Cost Construction .pdfRecycled Modular Low Cost Construction .pdf
Recycled Modular Low Cost Construction .pdf
 

NodeJSnodesforfreeinmyworldgipsnndnnd.pdf

  • 1. CS142 Lecture Notes - Node.js Node.js Mendel Rosenblum
  • 2. CS142 Lecture Notes - Node.js Threads versus Events request = readRequest(socket); reply = processRequest(request); sendReply(socket, reply); Implementation: Thread switching (i.e. blocking) and a scheduler startRequest(socket); listen("requestAvail", processRequest); listen("processDone", sendReplyToSock); Implementation: Event queue processing
  • 3. CS142 Lecture Notes - Node.js Threads versus Events using Callbacks request = readRequest(socket); reply = processRequest(request); sendReply(socket, reply); Implementation: Thread switching (i.e. blocking) and a scheduler readRequest(socket, function(request) { processRequest(request, function (reply) { sendReply(socket, reply); }); }); Implementation: Event queue processing
  • 4. CS142 Lecture Notes - Node.js Event queue ● Inner loop while (true) { if (!eventQueue.notEmpty()) { eventQueue.pop().call(); } } ● Never wait/block in event handler . Example readRequest(socket); 1. launchReadRequest(socket); // Returns immediately 2. When read finishes: eventQueue.push(readDoneEventHandler);
  • 5. CS142 Lecture Notes - Node.js Node.js ● Take a 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 ● Include DOM-like events and an event queue ○ Everything runs as a call from the event loop (already had one for browser events) ● Make event interface to all OS operations ○ Wrap all the OS blocking calls (file and socket/network io) ○ Add some data handle support ● Add a proper module system (predated import/export) ○ Each module gets its own scope (not everything in window)
  • 6. CS142 Lecture Notes - Node.js Example: Node.js reading a file let 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) { // Node callback convention: First argument is JavaScript Error object // dataBuffer is a special Node Buffer object if (!error) { console.log("smallFile contents", dataBuffer.toString()); } }
  • 7. CS142 Lecture Notes - Node.js Node Modules ● Import using require() - Can use ES6 import if file name *.mjs ○ System module: require("fs"); // Looks in node_modules 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 var notGlobal; function func1() {} function func2() {} module.exports = {func1: func1, func2: func2};
  • 8. CS142 Lecture Notes - Node.js 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)
  • 9. CS142 Lecture Notes - Node.js Node Buffer class ● Manipulating lots of binary data wasn't a strength of the JavaScript engine ○ Unfortunately that is what web servers do: DBMS ⇔ Web Server ⇔ Browser ● Node add 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, …) ● Optimized sharing with pointers rather than always copying ○ buffer.copy() ○ For example: fs.readFile to socket.write
  • 10. CS142 Lecture Notes - Node.js Buffer operations ● Supports operations for picking values out or updating them ○ 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
  • 11. CS142 Lecture Notes - Node.js Example: Node.js reading a file (redux) let fs = require("fs"); // fs has 81 properties readFile, writeFile, most OS calls, etc. fs.readFile("smallFile", readDoneCallback); // Start read // 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()); } }
  • 12. CS142 Lecture Notes - Node.js 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. CS142 Lecture Notes - Node.js Example: Three step process Threads 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!'); Works for non-blocking calls in both styles Callbacks 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!'); // Wrong!
  • 14. CS142 Lecture Notes - Node.js Example: Three step process Threads 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!'); Callbacks 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!'); }); }); });
  • 15. CS142 Lecture Notes - Node.js Listener/emitter pattern ● When programing with events (rather than threads) a listener/emitter pattern is often 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. CS142 Lecture Notes - Node.js Node: EventEmitter = require('events'); ● Listen with on() and signal with emit() 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 a nop
  • 17. CS142 Lecture Notes - Node.js Typical EventEmitter patterns ● Have multiple different events for different state or actions myEmitter.on('conditionA', doConditionA); myEmitter.on('conditionB', doConditionB); myEmitter.on('conditionC', doConditionC); myEmitter.on('error', handleErrorCondition); ● Handling 'error' is important - Node exits if not caught! myEmitter.emit('error', new Error('Ouch!'));
  • 18. CS142 Lecture Notes - Node.js Streams ● Build modules that produce and/or consume streams of data ● A popular way of structuring servers ○ Network interface ⇔ TCP/IP protocol processing ⇔ HTTP protocol processing ⇔ your code ● Can build connected streams dynamically ○ Add modules on stream: E.g. stream.push(Encryption) Network interface ⇔ 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. CS142 Lecture Notes - Node.js Readable streams - File reading using streams var readableStreamEvent = fs.createReadStream("bigFile"); 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. CS142 Lecture Notes - Node.js 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(); // Don't forget writableStreamEvent.on('error', …..
  • 21. CS142 Lecture Notes - Node.js Digression: Socket setup for TCP connections Client (Browser) 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, &serverAddr, sizeof(serveraddr)); listen(lfd, 5); sock = accept(lfd, &clientaddr, &clientlen); read(sock, buf, 3); write(sock, buf, 3) ● TCP/IP socket connection is a reliable, in-order byte stream ○ Note: reads can return data in different chunks that sent
  • 22. CS142 Lecture Notes - Node.js TCP Networking on Node.js ● Node net module wraps OS's network routines ● Includes higher level functionality like: let 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
  • 23. CS142 Lecture Notes - Node.js Example: A chat server let 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. CS142 Lecture Notes - Node.js 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. CS142 Lecture Notes - Node.js 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); ● Think about concurrency going on here
  • 26. CS142 Lecture Notes - Node.js Example: Read three files ● Linux read(open("f1"), buf1, f1Size); read(open("f2"), buf2, f2Size); read(open("f3"), buf3, f3Size); ● Node.js fs.readFile("f1", function (error, data1) { fs.readFile("f2", function (error, data2) { fs.readFile("f3", function (error, data3) { // Call Pyramid of Doom or Callback Hell }); }); });
  • 27. CS142 Lecture Notes - Node.js Example: Read N files var fileContents = {}; ['f1','f2','f3'].forEach(function (fileName) { fs.readFile(fileName, function (error, dataBuffer) { assert(!error); fileContents[fileName] = dataBuffer; }); }); If we want to use fileContents how do we know when all reads are finished? Recall: Can't wait in NodeJS
  • 28. CS142 Lecture Notes - Node.js Example: Read N files var fileContents = {}; ['f1','f2','f3'].forEach(function (fileName) { fs.readFile(fileName, function (error, dataBuffer) { assert(!error); fileContents[fileName] = dataBuffer; if (gotLastCallBack()) allDoneCallback(fileContents); }); }); ● Yuck!
  • 29. CS142 Lecture Notes - Node.js Async module: var async = require('async'); ● Solution: Write a function that turns waiting into a callback 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); }); }
  • 30. CS142 Lecture Notes - Node.js 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