introduction to node.js: perspectives from a drupal dev

79
Introduction to Node.js Perspectives from a Drupal dev Mike Cantelon, Vancouver Drupal Users Group, Nov. 25, 2010 Thursday, November 25, 2010

Upload: mcantelon

Post on 11-May-2015

16.842 views

Category:

Technology


1 download

DESCRIPTION

I gave a talk on November 25, 2010, on Node.js, and related technologies, to the Vancouver Drupal Users Group. The talk ran through why node.js is useful for realtime web apps, how to get it and Express up and running, and how to access data from Drupal and MongoDB.

TRANSCRIPT

Page 1: Introduction to Node.js: perspectives from a Drupal dev

Introduction to Node.jsPerspectives from a Drupal dev

Mike Cantelon, Vancouver Drupal Users Group, Nov. 25, 2010

Thursday, November 25, 2010

Page 2: Introduction to Node.js: perspectives from a Drupal dev

I am:

A longtime PHP dev

Devop for The Georgia Straight

Experimenting with JS/SSJS and HTML5

http://mikecantelon.com

http://github.com/mcantelon

Thursday, November 25, 2010

Page 3: Introduction to Node.js: perspectives from a Drupal dev

WHY NODE.JS?

Thursday, November 25, 2010

Page 4: Introduction to Node.js: perspectives from a Drupal dev

wordsquared.com: Real-time HTML/JS Scrabble MMO

Thursday, November 25, 2010

Page 5: Introduction to Node.js: perspectives from a Drupal dev

The real-time web

Real-time applications are an interesting web subset

Examples: Twitter, Etherpad, games, monitoring

Real-time paradigm will spawn new types of apps

Thursday, November 25, 2010

Page 6: Introduction to Node.js: perspectives from a Drupal dev

Three barriers to real-time

Conventional languages can be slow

Conventional web servers can be slow

Conventional databases are slow

Thursday, November 25, 2010

Page 7: Introduction to Node.js: perspectives from a Drupal dev

Node.js eliminates two

Conventional languages can be slow

Conventional web servers can be slow

Conventional databases are slow

Thursday, November 25, 2010

Page 8: Introduction to Node.js: perspectives from a Drupal dev

http://www.slideshare.net/Vodafonedeveloper/nodejs-vs-phpapache

Node.js vs PHP/Apache

Thursday, November 25, 2010

Page 9: Introduction to Node.js: perspectives from a Drupal dev

So what exactly is Node.js?

Server-side Javascript (SSJS) implementation

“Asynchronous” (more on that later)

Built using V8 (JS engine used in Chrome Browser)

Thursday, November 25, 2010

Page 10: Introduction to Node.js: perspectives from a Drupal dev

Advantages over PHP

Javascript is a cleaner language

Asynchronous execution increases performance

Node.js is suitable for writing TCP/IP apps

Thursday, November 25, 2010

Page 11: Introduction to Node.js: perspectives from a Drupal dev

“Asynchronous”?

Also known as “event-based”

Think of it as defining actions triggered by events

CPU spends less time waiting around

Thursday, November 25, 2010

Page 12: Introduction to Node.js: perspectives from a Drupal dev

More benefits of SSJS

Requires less mental context switching for devs

Allows sharing of logic between client and server side

Server-side JQuery for screen scraping? Yes!

Thursday, November 25, 2010

Page 13: Introduction to Node.js: perspectives from a Drupal dev

What about that last barrier?

Conventional languages are slow

Conventional servers are slow

Conventional databases are slow

Thursday, November 25, 2010

Page 14: Introduction to Node.js: perspectives from a Drupal dev

MongoDB is one solution

MongoDB is generally faster than SQL databases

MongoDB queries are written in Javascript, not SQL

MongoDB works well with node.js

Thursday, November 25, 2010

Page 15: Introduction to Node.js: perspectives from a Drupal dev

And Drupal?

Drupal is great for managing content

Node.js has no killer CMS

Node.js can pull data from Drupal (details later)

Thursday, November 25, 2010

Page 16: Introduction to Node.js: perspectives from a Drupal dev

This looks conceptually like...

Thursday, November 25, 2010

Page 17: Introduction to Node.js: perspectives from a Drupal dev

SSJS HELLO WORLD

Thursday, November 25, 2010

Page 18: Introduction to Node.js: perspectives from a Drupal dev

Node.js isn’t hard to learn

Knowing Javascript is the hard part

Node.js is accessible

Express is a framework that makes Node.js easier

Thursday, November 25, 2010

Page 19: Introduction to Node.js: perspectives from a Drupal dev

Hello World in Node.js shell

var sys = require('sys');sys.puts('Hello world');

Thursday, November 25, 2010

Page 20: Introduction to Node.js: perspectives from a Drupal dev

Node.js server Hello World

var http = require('http');

http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n');}).listen(8124, "127.0.0.1");

Thursday, November 25, 2010

Page 21: Introduction to Node.js: perspectives from a Drupal dev

Hello World in Expressvar express = require('express');var app = express.createServer();

app.get('/', function(req, res){ res.send('Hello World');});

app.listen(8124);

Thursday, November 25, 2010

Page 22: Introduction to Node.js: perspectives from a Drupal dev

Why use Express?

Handles routing and redirection

Nice templating support

Provides sessions

Thursday, November 25, 2010

Page 23: Introduction to Node.js: perspectives from a Drupal dev

Express Templating Support

Supports EJS, HAML, SASS, Jade (HAML variant)

Extend with app-specific helper functions

Provides “partials” (subtemplates)

Thursday, November 25, 2010

Page 24: Introduction to Node.js: perspectives from a Drupal dev

app.get('/', function(req, res){ res.render('index.haml', { locals: { title: 'My Site' } });});

Templating Example

Thursday, November 25, 2010

Page 25: Introduction to Node.js: perspectives from a Drupal dev

SETTING UP NODE.JS

Thursday, November 25, 2010

Page 26: Introduction to Node.js: perspectives from a Drupal dev

Installing Node.js

OS X: build from source or brew install node

Linux: build from source

Build instructions at http://nodejs.org/#download

Thursday, November 25, 2010

Page 27: Introduction to Node.js: perspectives from a Drupal dev

Installing NPM

NPM lets you easily install node.js modules

OS X: brew install npm

Instructions for manual install:http://mikecantelon.com/npm

Thursday, November 25, 2010

Page 28: Introduction to Node.js: perspectives from a Drupal dev

Installing Express

npm install express

Now the command express will set up an example Express app for you

Thursday, November 25, 2010

Page 29: Introduction to Node.js: perspectives from a Drupal dev

Installing MongoDB

OS X: build from source or brew install mongodb

Linux: http://www.mongodb.org/display/DOCS/Quickstart+Unix

npm install mongodb

Thursday, November 25, 2010

Page 30: Introduction to Node.js: perspectives from a Drupal dev

DRUPAL -> NODE.JS

Thursday, November 25, 2010

Page 31: Introduction to Node.js: perspectives from a Drupal dev

Drupal as a datastore

One way Node.js and Drupal can work together is having Drupal be the storehouse for important content requiring long-term management

Thursday, November 25, 2010

Page 32: Introduction to Node.js: perspectives from a Drupal dev

Something like...

Thursday, November 25, 2010

Page 33: Introduction to Node.js: perspectives from a Drupal dev

Serve data, not just pages

For realtime apps you’re going to want to serve chunks of data to the browser rather than whole pages

Whole pages take longer to render and use more bandwidth to transmit

Leverage the browser as much as possible

Thursday, November 25, 2010

Page 34: Introduction to Node.js: perspectives from a Drupal dev

Serving a page...

1. Browser requests a URL2. Server grabs some data from a database and dresses it up as a page using a template.3. Whole page gets sent back to browser

Thursday, November 25, 2010

Page 35: Introduction to Node.js: perspectives from a Drupal dev

...vs Serving Data

1. Browser requests some data2. Server sends back data3. Browser templates data and outputs HTML into the existing page

Thursday, November 25, 2010

Page 36: Introduction to Node.js: perspectives from a Drupal dev

Where to serve data from

Pulling Drupal data directly to the browser is quick to implement, but puts more stress on your Drupal stack

The alternative is to pull Drupal data to node.js and cache using a datastore like MongoDB

Data can then be relayed via AJAX or Socket.io

Thursday, November 25, 2010

Page 37: Introduction to Node.js: perspectives from a Drupal dev

DRUPAL DATA SHARING

Thursday, November 25, 2010

Page 38: Introduction to Node.js: perspectives from a Drupal dev

Javascript For Data Sharing

JSON is the duct tape of the web

drupal_to_js turns any chunk of data into JSON

Drupal Views can output JSON via Views Datasource

Thursday, November 25, 2010

Page 39: Introduction to Node.js: perspectives from a Drupal dev

What JSON looks like

{ 'drupal': { 'language': 'PHP', 'license': 'GPL', 'developed_by': { 'individuals', 'organizations', 'companies' } }}

Thursday, November 25, 2010

Page 40: Introduction to Node.js: perspectives from a Drupal dev

Drupal pumping out JSON

Thursday, November 25, 2010

Page 41: Introduction to Node.js: perspectives from a Drupal dev

Example: RSS to JSON via Views

Thursday, November 25, 2010

Page 42: Introduction to Node.js: perspectives from a Drupal dev

What our example will do

Use the Aggregator module to pull data from an RSS feed (specifically “Drupal Planet”)

Use Views, via the Views JSON module, to publish the aggregator items as JSON data

Thursday, November 25, 2010

Page 43: Introduction to Node.js: perspectives from a Drupal dev

Install Views Datasource

Thursday, November 25, 2010

Page 44: Introduction to Node.js: perspectives from a Drupal dev

Add View

Thursday, November 25, 2010

Page 45: Introduction to Node.js: perspectives from a Drupal dev

Add Page Display and Path

Thursday, November 25, 2010

Page 46: Introduction to Node.js: perspectives from a Drupal dev

Add Paging

Thursday, November 25, 2010

Page 47: Introduction to Node.js: perspectives from a Drupal dev

Add Fields

Thursday, November 25, 2010

Page 48: Introduction to Node.js: perspectives from a Drupal dev

Set Style to JSON

Thursday, November 25, 2010

Page 49: Introduction to Node.js: perspectives from a Drupal dev

Set Feed/Category ID

Thursday, November 25, 2010

Page 50: Introduction to Node.js: perspectives from a Drupal dev

Save View and Check Path

Thursday, November 25, 2010

Page 51: Introduction to Node.js: perspectives from a Drupal dev

Demo use of Drupal/JSON...

[demo]

http://github.com/mcantelon/Drupalurk

Thursday, November 25, 2010

Page 52: Introduction to Node.js: perspectives from a Drupal dev

Hack for Paging (v6 beta2)

function mytheme_preprocess_views_views_json_style_simple(&$vars) { global $pager_total, $pager_page_array; $element = $vars['view']->pager['element']; $vars['rows']['pager'] = array( 'total' => $pager_total[$element], 'current' => $pager_page_array[$element] );}

http://gist.github.com/581974

Views Datasource needs theme tweak to make paging work

Stick the snippet below into your theme’s template.php

Thursday, November 25, 2010

Page 53: Introduction to Node.js: perspectives from a Drupal dev

Hack for Paging (v6 beta2)

This enables you to add &page=<page number starting at 0> to JSON calls

You can then implement your own JS paging

Thursday, November 25, 2010

Page 54: Introduction to Node.js: perspectives from a Drupal dev

Possible JSON View Uses

Pull front-page content

Pull content by taxonomy

Pull recent comments

Whatever else you can do with a view

Thursday, November 25, 2010

Page 55: Introduction to Node.js: perspectives from a Drupal dev

Pulling JSON into Node.js

var sys = require('sys'), rest = require('restler-aaronblohowiak'), item, node

rest.get('http://mikecantelon.com/jsontest/News') .addListener('complete', function(data) {

for(item in data.nodes) { node = data.nodes[item].node sys.puts(node.Title) sys.puts(node.Body) }})

http://gist.github.com/608741

restler module allows easy HTTP JSON requests

Thursday, November 25, 2010

Page 56: Introduction to Node.js: perspectives from a Drupal dev

TALKING TO MONGODB

Thursday, November 25, 2010

Page 57: Introduction to Node.js: perspectives from a Drupal dev

Things to remember

Can create databases and schema on-the-fly

Queries are Javascript

A “collection” is similar to an SQL DB’s “table”

MongoDB has a shell so easy to experiment

Thursday, November 25, 2010

Page 58: Introduction to Node.js: perspectives from a Drupal dev

Doing something to data

1. Open server DB connection2. Open database3. Open collection4. Do something to the collection

Thursday, November 25, 2010

Page 59: Introduction to Node.js: perspectives from a Drupal dev

Opening server DB connection

var mongo = require('mongodb');var port = mongo.Connection.DEFAULT_PORT;var db = new mongo.Db( 'classroom', new mongo.Server('localhost', port, {}), {});

Thursday, November 25, 2010

Page 60: Introduction to Node.js: perspectives from a Drupal dev

Opening database

db.open(function(err, db) { // stuff gets done in here});

Thursday, November 25, 2010

Page 61: Introduction to Node.js: perspectives from a Drupal dev

Opening a collection

db.collection( 'students', function(err, collection) { // collection operations here });

Thursday, November 25, 2010

Page 62: Introduction to Node.js: perspectives from a Drupal dev

Removing from a collection

collection.remove( function(err, collection) { // records are now gone! });

Thursday, November 25, 2010

Page 63: Introduction to Node.js: perspectives from a Drupal dev

Adding some records

// make four students with random agesvar names = ['Rick', 'Jane', 'Bob', 'Lisa'];

var index;for (index in names) { collection.insert({ 'name': (names[index]), 'age': Math.round(Math.random(4)*10)+18 });}

Thursday, November 25, 2010

Page 64: Introduction to Node.js: perspectives from a Drupal dev

Displaying data from records

// display namescollection.find({}, {}, function(err, cursor) { cursor.toArray( function(err, students) { var index; for(index in students) { sys.puts(students[index].name); }; } ); });

Thursday, November 25, 2010

Page 65: Introduction to Node.js: perspectives from a Drupal dev

DEPLOYING NODE.JS

Thursday, November 25, 2010

Page 66: Introduction to Node.js: perspectives from a Drupal dev

Node.js isn’t a daemon

Like PHP, node.js doesn’t run as a daemon

This means that naive deployment would require keeping a terminal open

There are a number of ways to deal with this...

Thursday, November 25, 2010

Page 67: Introduction to Node.js: perspectives from a Drupal dev

Upstart (Ubuntu/some other distros)

Make a config file for each app in /etc/init

Name config file my_app.conf and set as executable

Start app using: sudo start my_app

Thursday, November 25, 2010

Page 68: Introduction to Node.js: perspectives from a Drupal dev

Installing Upstart

Ubuntu: apt-get install upstart

Linux: http://upstart.ubuntu.com/download.html

Thursday, November 25, 2010

Page 69: Introduction to Node.js: perspectives from a Drupal dev

System V init script (the right way)

rc.local/custom script (quick and dirty)

Gnu screen (for temporary deployment)

No Upstart? (Centos/some other distros)

Thursday, November 25, 2010

Page 70: Introduction to Node.js: perspectives from a Drupal dev

Requires adding a line to /etc/rc.local and a script

Example line in rc.local triggers script at startup:su - mike -c "/home/mike/drupalchat/RUN.sh" &

Script should set NODE_PATH if you’re using npm

rc.local/custom script

Thursday, November 25, 2010

Page 71: Introduction to Node.js: perspectives from a Drupal dev

Example script

#!/bin/bashcd /home/mike/drupalchatexport NODE_PATH=/home/mike/root/usr/local/bin/node server.js

Thursday, November 25, 2010

Page 72: Introduction to Node.js: perspectives from a Drupal dev

Hotnode will restart node.js when you change a file

Start app with hotloading: hotnode my_app.js

Installation: npm install hotnode

Hotnode

Thursday, November 25, 2010

Page 73: Introduction to Node.js: perspectives from a Drupal dev

BONUS! WEBSOCKETS

Thursday, November 25, 2010

Page 74: Introduction to Node.js: perspectives from a Drupal dev

What are WebSockets?

WebSockets are an “HTML5” technology for two-way TCP/IP textual communication

Modern browsers, like Chrome and Firefox 4, offer a Javascript WebSockets interface

Thursday, November 25, 2010

Page 75: Introduction to Node.js: perspectives from a Drupal dev

Why not just use AJAX?

AJAX is a hack that uses HTTP for communication

HTTP request/response cycle has a lot of overhead

WebSockets increase speed, lessen bandwidth use

Thursday, November 25, 2010

Page 76: Introduction to Node.js: perspectives from a Drupal dev

Implementing with Socket.io

Socket.io is a client/server websocket solution, using Node.js for the server side

The client library tries WebSockets, but falls back to other mechanisms when talking to old browsers

Thursday, November 25, 2010

Page 77: Introduction to Node.js: perspectives from a Drupal dev

Questions? Ideas?

Thursday, November 25, 2010

Page 78: Introduction to Node.js: perspectives from a Drupal dev

Flickr Credits

http://www.flickr.com/photos/sidehike/459483568/http://www.flickr.com/photos/wysz/86758900/http://www.flickr.com/photos/generated/291537716/http://www.flickr.com/photos/gsfc/3720663082/http://www.flickr.com/photos/skreuzer/354316778/http://www.flickr.com/photos/ubookworm/455760111/http://www.flickr.com/photos/batega/1596898776/http://www.flickr.com/photos/batigolix/3778363253/http://www.flickr.com/photos/wwworks/4472384764/http://www.flickr.com/photos/19779889@N00/4398186065/http://www.flickr.com/photos/theplanetdotcom/4878809615/http://www.flickr.com/photos/estherase/177188677/

Thursday, November 25, 2010

Page 79: Introduction to Node.js: perspectives from a Drupal dev

Resources

Node.js, Express.js and MongoDBhttp://nodejs.org/http://expressjs.com/http://www.mongodb.org/

Socket.iohttp://socket.io/

This presentationhttp://mikecantelon.com/drupal-nodejs

Thursday, November 25, 2010