Intro To Node.js

31
Intro to Node.js Chris Cowan Lead Engineer http://www.plus3network.com

description

This is a presentation I prepared for a local meetup. The audience is a mix of web designers and developers who have a wide range of development experience.

Transcript of Intro To Node.js

Page 1: Intro To Node.js

Intro to Node.jsChris Cowan

Lead Engineerhttp://www.plus3network.com

Page 2: Intro To Node.js

Node’s Goal is to provide an easy way to build scalable

network programs.

Page 3: Intro To Node.js

Node.js is NOT anotherweb framework!

But you can create a web framework using NPM modules.

Page 4: Intro To Node.js

Node.js is…Web ServerTCP Server

Awesome Robot ControllerCommand Line Application

Proxy ServerStreaming ServerVoiceMail ServerMusic Machine

Anything that has to deal with high I/O

Page 5: Intro To Node.js

Node.js isServer Side JavaScript!

Page 6: Intro To Node.js

Node.js is

FUN!

Page 7: Intro To Node.js

Why Node.js?• Non Blocking I/O• Based on Chrome’s V8 Engines (FAST!)• 15,000+ Modules • Active Community (IRC, Mailing Lists, Twitter,

Github)• Mac, Linux and Windows (all first class citizens)• One Language for Frontend and Backend• JavaScript is the Language of the Web

Page 8: Intro To Node.js

Installing Node.jsMac OS X1. Go to http://nodejs.org and click install2. Install the downloaded package

Windows3. Go to http://nodejs.org and click install4. Install the downloaded package

Linux (and *nix variants)5. Go to http://nodejs.org and click install6. Decompress source and… ./configure … make … make install

( for Ubuntu use Chris Lea’s PPA – ppa:chris-lea/node.js )

Page 9: Intro To Node.js

Some BasicExamples

Page 10: Intro To Node.js

Hello WorldCreate hello-world.js

console.log(‘Hello World’);

On the command line run

node hello-world.js

You should see

Hello World

Page 11: Intro To Node.js

Basic HTTP Server

*Running this script my development box, I can achieve 10,000+ requests per second

with 100 concurrent connectionswithout breaking a sweat

var http = require('http'); var server = http.createServer(function (req, res) {  res.writeHead(200);  res.end('Hello World');}); server.listen(4000);

Page 12: Intro To Node.js

Some people use the core http module to

build their web apps, most use a framework

like Expressor Connect or Flatiron or Tako or Derby or Geddy or Mojito or …

Page 13: Intro To Node.js

Visithttp://expressjs.com/guide.html

for a detailed guide on using Express

Page 14: Intro To Node.js

What is Non-Blocking I/O?And why should I care?

Page 15: Intro To Node.js

Blocking I/

270ms = SUM(user, activities, leaderboard)

// Get User – 20ms$query = 'SELECT * FROM users WHERE id = ?';$users = query($query, array($id));print_r($users); // Get Activities – 100ms$query = 'SELECT * FROM activities ORDER BY timestamp LIMIT 50';$activities = query($query);print_r($activities); // Get Leader Board – 150ms$query = 'SELECT count(points) as total, user_id FROM activities LIMIT 50';$leader_board = query($query);

Page 16: Intro To Node.js

Non-Blocking I/

150ms = MAX(user, activities, leaderboard)

// Get User – 20msvar query = 'SELECT * FROM users WHERE id = ?';db.query(query, [userId], function (err, results) {  console.log(results);}); // Get Activities – 100msvar query = 'SELECT * FROM activities ORDER BY timestamp LIMIT 50';db.query(query, function (err, results) {  console.log(results);}); // Get Leader Board – 150msvar query = 'SELECT count(points) as total, user_id FROM activities LIMIT 50';db.query(query, function (err, results) {  console.log(results);});

Page 17: Intro To Node.js

The most jarring thing about Server Side JavaScript

is thinking in callbacks

Page 18: Intro To Node.js

The Node Callback PatternawesomeFunction(arg, function (err, data) {   if (err) {      // Handle Error   }      // Do something awesome with results.});

• Error first then success… ALWAYS!• Because this is the de-facto standard 99.99999% of the time

you will be able to guess how a Node library will work.

Page 19: Intro To Node.js

Callbacks are the Devil’s Work!Don’t go down this rabbit hole…

One of the biggest mistakes is to get yourself in to callback hell by nesting callbacks inside of

callbacks inside of more callbacks.

var userQuery = 'SELECT * FROM users WHERE id = ?';var activityQuery = 'SELECT * FROM activities ORDER BY timestamp LIMIT 50';var leaderBoardQuery = 'SELECT count(points) as total, user_id FROM activities LIMIT 50'; db.query(userQuery, [id], function (userErr, userResults) {   db.query(activityQuery, function (activityErr, activityResults) {      db.query(leaderBoardQuery, function (leaderBoardErr, leaderBoardResults) {          // Do something here       });   });});

Page 20: Intro To Node.js

Avoiding Callback Hell• Keep your code shallow• Break up your code into small chunks• Use a sequential library like async• Visit http://callbackhell.com

Page 21: Intro To Node.js

Async to the rescue!var async = require('async');var db = require(’db'); function getUser (callback) {  var query = 'SELECT * FROM users WHERE id = ?';  db.query(query, [userId], callback);} function getActivities (callback) {  var query = 'SELECT * FROM activities ORDER BY timestamp LIMIT 50';  db.query(query, callback);} function getLeaderBoard (callback) {  var query = 'SELECT count(points) as total, user_id FROM activities LIMIT 50';  db.query(query, callback);} var tasks = [getUser, getActivities, getLeaderBoard];async.parallel(tasks, function (err, results) {  var user = results[0][0];  var activities = results[1];  var leaderBoard = results[2];});

Page 22: Intro To Node.js

Visithttps://github.com/caolan/async

for a detailed guide on using the async module.

Async provides several useful patterns for asynchronous control flow

including: parallel, series, waterfall, auto and queue.

Page 23: Intro To Node.js

The Node Package Managerotherwise know as… NPM

It’s how you harness the awesomeness of the Node.js community!

Page 24: Intro To Node.js

Using NPMIt’s standard practice to install modules locally for your current project. Modules are installed in the ./node_modules in the current directory.

To Install a new module

npm install <module>

To find a module in the NPM repository

npm search <search string>

To list the modules (and their dependencies) in the current project

npm list

To see module details

npm info <module>

Page 25: Intro To Node.js

DON’T INSTALL MODULES GLOBALLY!

Unless they are tools like node-dev, jake, express, minify-js OR linked development modules but more on that later.

Page 26: Intro To Node.js

NPM is awesome sauce!

Visithttps://npmjs.org

for more details about NPM and to browse the current NPM Repository

Page 27: Intro To Node.js

Creating your own modules• Node.js uses CommonJS Modules• require(‘./example’) will load either

example.js or example/index.js or the entry point specified in package.json

• Run npm init to bootstrap your new module• Try to stick to creating Pure JavaScript

modules if possible. It will give you less headaches down the road.

Page 28: Intro To Node.js

Basic Module ExampleEverything exposed via module.exports is available as an instance variable.

Once you’ve created a module in counter.js you use it like this…

Keep this in mind… modules are loaded once and cached. So when you load the module a second time in your app, require just returns the cache copied. This lets you do interesting things…

var currentCount = 0; module.exports.incr = function () {  return ++currentCount;};

var counter = require(’./counter');var count = counter.incr();

Page 29: Intro To Node.js

Installing your module• Run npm link in the module working directory• Then run npm link <module> in the your

project folder to link it from the global module to your local node_modules.

• OR you can create a private registry (See https://npmjs.org/doc/registry.html)

• OR just link it by hand :P

Page 30: Intro To Node.js

My Favorite Modules• request• async• node-dev• underscore• express

• jake• hogan.js• connect• moment• mysql

Page 31: Intro To Node.js

Questions?Contact me at [email protected]