Skip to main content
Node.js on Azure
Israel Windows Azure UG
        Sasha Goldshtein
        CTO, SELA Group
 blog.sashag.net | @goldshtn
Agenda
• Introduction to Node.js
• Running Node.js on Azure



Azure     Mongoose      Ubuntu       MySQL
  WebMatrix PaaS         Node.js       MongoDB
 Cloud9     Express    Jade          SQL Azure
   nstore    Web Sites        IaaS
Why Am I Using a Mac?
The New Microsoft
• Open
• Flexible
• Competitive

You can run a Node.js web service on a Ubuntu (Linux) VM
on Windows Azure that uses Redis for caching, MongoDB
for sessions, and an SQL Azure database for most models.
   Oh, and you can integrate it with a Windows 8 app.
What’s Node.js?
• JavaScript on the server on top of Google V8
• Hundreds of modules, vibrant ecosystem
  – HTTP/HTTPS, TCP/UDP servers
  – File system access, child processes
  – DB bindings for just about anything
  – MVC framework (Express)
  – Everything is open source (mostly on Github)
What’s The Difference Between These
      Two JavaScript Functions?

function f() {                         function g() {
  return                                 return {
  {
     ok: false                                    ok: true
  };                                         };
}                                      }

Credit: Douglas Crockford, JavaScript Guru
Why Node.js?
• It’s The Hip Thing To Do™
• Makes adaptation easier for JavaScript front-
  end developers
• Rapid development, POCs
• Easy to work concurrently without perils of
  multithreading and parallelism
• Tiny footprint compared to most server-side
  frameworks
I hate JavaScript. Why am I
     From 0 to 100 this?!?!
             doing in 60 Seconds
• Hello, World Node.js web server

var http = require(‘http’);
http.createServer(function (req, res) {
  res.writeHead(200, {‘Content-Type’: ‘text/plain’});
  res.end(‘Hello, World!n’);
}).listen(8080);
Event-Driven Architecture
• Node uses a single event thread by default
• All I/O is asynchronous
                            node process

                           Event Queue
                callback                   I/O Completions

        Event                callback
       Thread
                             callback
Asynchronous Everywhere
• Almost no blocking APIs
   – “Scaling Node.js for 100K concurrent requests”
   – Suffers from nested async callbacks peril
http.createServer(function (req, res) {
  var path = url.parse(request.url).pathname;
  AllowedPath.find({ name: path }, function (e1, p) {
    if (e1) ...
    fs.readFile(p.full_path, function (e2, contents) {
      if (e2) ...
      res.end(contents);
    });
  });
});
What About Azure?
Web Sites
• Shared/reserved, free tier
• Your front-end on Azure

PaaS
• Cloud service
• Web role, Worker role

IaaS
• Bring your own VM
• Windows, multiple Linux flavors
Node.js, Meet Azure Web Sites
• Node.js Azure Web Site
   – Put your main server code in app.js
   – Deploy using Git or FTP

var port = process.env.port || 8080;
var http = require(‘http’);
http.createServer(function (req, res) {
  res.writeHead(200, {‘Content-Type’: ‘text/plain’});
  res.end(‘Hello, World!n’);
}).listen(port);
Express Fundamentals
• Powerful middleware for Node
   – Serves static files, renders views with templates,
     parses POSTs, provides sessions and cookies,
     supports authentication…

var app = express.createServer();
app.get(‘/hello’, function (req, res) {
  res.sendfile(‘hello.htm’);
});
app.post(‘/echo’, function (req, res) {
  res.end(‘You said: ‘ + req.body.message);
});
Data Store for POC Purposes
• The nstore module stores data in a flat file and
  maintains an in-memory index
• Great for POC purposes

var messages = nstore.new(‘messages.db’, ...);
messages.save(msg.id, msg, function (err) ...);

messages.all(function (err, results) { ... });
messages.find({ user: ‘Sasha’ }, ...);
Node.js Deployment to Azure Web Sites

DEMO
Datastore Flexibility
• To minimize Azure Web Sites dependencies,
  can use local files (nstore module)
• Even in an on-premise application, can use
  Azure Table Storage
• On the VM, can use practically any DB
• With either, can use SQL Azure
Using Azure Table Storage
var azure = require(‘azure’);
var ts = azure.createTableService(account, key);
ts.createTableIfNotExists(‘messages’, ...);

var msg = {
  PartitionKey: ‘partition’,
  RowKey: uuid.v1(),
  ...
};
ts.insertEntity(‘messages’, msg, function(err) ...);
Use Table Storage from Node.js On-Premise Application

DEMO
Using SQL Azure
• Experimental node-sqlserver module;
  requires SQL Server Native Client, Windows-
  only, currently supports Node 0.6.x only

var sql = require(‘node-sqlserver’);
sql.query(conn_str, ‘SELECT * FROM Messages’,
  function (err, results) {
    if (!err) ...
  }
);
sql.queryRaw(conn_str, ‘INSERT INTO Messages ...’);
Use SQL Azure from Node.js Azure Web Site

DEMO
Bonus: Windows Azure Mobile
               Services
• Don’t bother writing HTTP requests from your
  Windows 8 app
• Create a Windows Azure Mobile Service

var table = MobileService.GetTable<Message>();
var messages = table.Where(
  m => m.User == ‚Sasha‛).ToList();
table.InsertAsync(new Message { ... });
Node.js, Meet Azure VM
• Azure VMs give you full flexibility – install
  whatever you want
   – Pick from Windows or multiple Linux distros


• We’ll use Mongoose (MongoDB ORM)

var db = mongoose.createConnection(...);
var Message = db.model(‘Message’, taskSchema);
Message.find(function (err, results) { ... });
Using Node.js with MongoDB from Ubuntu Server Azure VM

DEMO
WebMatrix vs. Cloud9
WebMatrix (Windows)            Cloud9
• Free IDE for easy Web Site   • Web-based IDE that
  development, including          supports deployment to
  with Node.js                    Azure Websites

http://www.microsoft.com/we    http://c9.io
b/webmatrix/
Using WebMatrix with Windows Azure Web Sites

DEMO
Summary
• Azure is open, flexible, and competitive
• Node.js is an awesome server framework
• “Better together”
Questions

http://s.sashag.net/RoIJLf

        Sasha Goldshtein
        CTO, SELA Group
 blog.sashag.net | @goldshtn
Learn More
•   Node.js download and documentation
•   Node.js on Azure home (bunch of tutorials)
•   Express
•   Mongoose
•   node-sqlserver