Shaun Xu

The Sheep-Pen of the Shaun


News

logo

Shaun, the author of this blog is a semi-geek, clumsy developer, passionate speaker and incapable architect with about 10 years experience in .NET. He hopes to prove that software development is art rather than manufacturing. He's into cloud computing platform and technologies (Windows Azure, Aliyun) as well as WCF and ASP.NET MVC. Recently he's falling in love with JavaScript and Node.js.

Currently Shaun is working at IGT Technology Development (Beijing) Co., Ltd. as the architect responsible for product framework design and development.

MVP

My Stats

  • Posts - 95
  • Comments - 338
  • Trackbacks - 0

Tag Cloud


Recent Comments


Recent Posts


Archives


Post Categories



Two weeks ago I had had a talk with Wang Tao, a C# MVP in China who is currently running his startup company and product named worktile. He asked me to figure out a synchronization solution which helps his product in the future. And he preferred me implementing the service in Node.js, since his worktile is written in Node.js.

Even though I have some experience in ASP.NET MVC, HTML, CSS and JavaScript, I don’t think I’m an expert of JavaScript. In fact I’m very new to it. So it scared me a bit when he asked me to use Node.js. But after about one week investigate I have to say Node.js is very easy to learn, use and deploy, even if you have very limited JavaScript skill. And I think I became love Node.js.

Hence I decided to have a series named “Node.js Adventure”, where I will demonstrate my story of learning and using Node.js in Windows and Windows Azure. And this is the first one.

 

(Brief) Introduction of Node.js

I don’t want to have a fully detailed introduction of Node.js. There are many resource on the internet we can find. But the best one is its homepage.

Node.js was created by Ryan Dahl, sponsored by Joyent. It’s consist of about 80% C/C++ for core and 20% JavaScript for API. It utilizes CommonJS as the module system which we will explain later. The official definition of Node.js is

Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

First of all, Node.js utilizes JavaScript as its development language and runs on top of V8 engine, which is being used by Chrome. It brings JavaScript, a client-side language into the backend service world. So many people said, even though not that actually, “Node.js is a server side JavaScript”.

image

Additionally, Node.js uses an event-driven, non-blocking IO model. This means in Node.js there’s no way to block currently working thread. Every operation in Node.js executed asynchronously. This is a huge benefit especially if our code needs IO operations such as reading disks, connect to database, consuming web service, etc..

Unlike IIS or Apache, Node.js doesn’t utilize the multi-thread model. In Node.js there’s only one working thread serves all users requests and resources response, as the ST star in the figure below. And there is a POSIX async threads pool in Node.js which contains many async threads (AT stars) for IO operations.

image

When a user have an IO request, the ST serves it but it will not do the IO operation. Instead the ST will go to the POSIX async threads pool to pick up an AT, pass this operation to it, and then back to serve any other requests. The AT will actually do the IO operation asynchronously.

image

Assuming before the AT complete the IO operation there is another user comes. The ST will serve this new user request, pick up another AT from the POSIX and then back.

image

If the previous AT finished the IO operation it will take the result back and wait for the ST to serve. ST will take the response and return the AT to POSIX, and then response to the user.

image

And if the second AT finished its job, the ST will response back to the second user in the same way.

image

As you can see, in Node.js there’s only one thread serve clients’ requests and POSIX results. This thread looping between the users and POSIX and pass the data back and forth. The async jobs will be handled by POSIX. This is the event-driven non-blocking IO model.

The performance of is model is much better than the multi-threaded blocking model. For example, Apache is built in multi-threaded blocking model while Nginx is in event-driven non-blocking mode. Below is the performance comparison between them.

image

And below is the memory usage comparison between them.

image

These charts are captured from the video NodeJS Basics: An Introductory Training, which presented at Cloud Foundry Developer Advocate.

 

Node.js on Windows

To execute Node.js application on windows is very simple. First of you we need to download the latest Node.js platform from its website. After installed, it will register its folder into system path variant so that we can execute Node.js at anywhere. To confirm the Node.js installation, just open up a command windows and type “node”, then it will show the Node.js console.

image

As you can see this is a JavaScript interactive console. We can type some simple JavaScript code and command here. To run a Node.js JavaScript application, just specify the source code file name as the argument of the “node” command.

For example, let’s create a Node.js source code file named “helloworld.js”. Then copy a sample code from Node.js website.

image

   1: var http = require("http");
   2:  
   3: http.createServer(function (req, res) {
   4:     res.writeHead(200, {"Content-Type": "text/plain"});
   5:     res.end("Hello World\n");
   6: }).listen(1337, "127.0.0.1");
   7:  
   8: console.log("Server running at http://127.0.0.1:1337/");

This code will create a web server, listening on 1337 port and return “Hello World” when any requests come. Run it in the command windows.

image

Then open a browser and navigate to http://localhost:1337/.

image

As you can see, when using Node.js we are not creating a web application. In fact we are likely creating a web server. We need to deal with request, response and the related headers, status code, etc.. And this is one of the benefit of using Node.js, lightweight and straightforward.

But creating a website from scratch again and again is not acceptable. The good news is that, Node.js utilizes CommonJS as its module system, so that we can leverage some modules to simplify our job. And furthermore, there are about ten thousand of modules available n the internet, which covers almost all areas in server side application development.

 

NPM and Node.js Modules

Node.js utilizes CommonJS as its module system. A module is a set of JavaScript files. In Node.js if we have an entry file named “index.js”, then all modules it needs will be located at the “node_modules” folder. And in the “index.js” we can import modules by specifying the module name.

For example, in the code we’ve just created, we imported a module named “http”, which is a build-in module installed alone with Node.js. So that we can use the code in this “http” module.

image

Besides the build-in modules there are many modules available at the NPM website. Thousands of developers are contributing and downloading modules at this website. Hence this is another benefit of using Node.js. There are many modules we can use, and the numbers of modules increased very fast, and also we can publish our modules to the community. When I wrote this post, there are totally 14,608 modules at NPN and about 10 thousand downloads per day.

Install a module is very simple. Let’s back to our command windows and input the command “npm install express”. This command will install a module named “express”, which is a MVC framework on top of Node.js.

image

And let’s create another JavaScript file named “helloweb.js” and copy the code below in it. I imported the “express” module. And then when the user browse the home page it will response a text. If the incoming URL matches “/Echo/:value” which the “value” is what the user specified, it will pass it back with the current date time in JSON format. And finally my website was listening at 12345 port.

   1: var express = require("express");
   2: var app = express();
   3:  
   4: app.get("/", function(req, res) {
   5:     res.send("Hello Node.js and Express.");
   6: });
   7:  
   8: app.get("/Echo/:value", function(req, res) {
   9:     var value = req.params.value;
  10:     res.json({
  11:         "Value" : value,
  12:         "Time" : new Date()
  13:     });
  14: });
  15:  
  16: console.log("Web application opened.");
  17: app.listen(12345);

For more information and API about the “express”, please have a look here.

Start our application from the command window by command “node helloweb.js”, and then navigate to the home page we can see the response in the browser.

image

And if we go to, for example http://localhost:12345/Echo/Hello Shaun, we can see the JSON result.

image

The “express” module is very populate in NPM. It makes the job simple when we need to build a MVC website. There are many modules very useful in NPM.

- underscore: A utility module covers many common functionalities such as for each, map, reduce, select, etc..

- request: A very simple HTT request client.

- async: Library for coordinate async operations.

- wind: Library which enable us to control flow with plain JavaScript for asynchronous programming (and more) without additional pre-compiling steps.

 

Node.js and IIS

I demonstrated how to run the Node.js application from console. Since we are in Windows another common requirement would be, “can I host Node.js in IIS?” The answer is “Yes”.

Tomasz Janczuk created a project IISNode at his GitHub space we can find here. And Scott Hanselman had published a blog post introduced about it.

 

Summary

In this post I provided a very brief introduction of Node.js, includes it official definition, architecture and how it implement the event-driven non-blocking model. And then I described how to install and run a Node.js application on windows console. I also described the Node.js module system and NPM command. At the end I referred some links about IISNode, an IIS extension that allows Node.js application runs on IIS.

Node.js became a very popular server side application platform especially in this year. By leveraging its non-blocking IO model and async feature it’s very useful for us to build a highly scalable, asynchronously service. I think Node.js will be used widely in the cloud application development in the near future.

 

In the next post I will explain how to use SQL Server from Node.js.

 

Hope this helps,

Shaun

All documents and related graphics, codes are provided "AS IS" without warranty of any kind.
Copyright © Shaun Ziyan Xu. This work is licensed under the Creative Commons License.

Comments

Gravatar # re: Node.js Adventure - Node.js on Windows
Posted by szoftver összehasonlítás on 9/17/2012 4:58 PM
I was interrested in node.js since ~1 year but this is the first quick&correct post about it for me.

Thank you for writing it and I'm looking forward for the next post.
Gravatar # re: Node.js Adventure - Node.js on Windows
Posted by tatabánya gyerekangol on 9/18/2012 4:41 AM
szoftver összehasonlítás: I had the same feelings so pls keep up the good work!
Gravatar # Simple and super awesum!
Posted by Nitin on 2/10/2013 2:52 PM
This is what is called a tutorial. Simple and easy to understand and get you going quickly. Wonderful work and keep up the spirits..
Gravatar # re: Node.js Adventure - Node.js on Windows
Posted by Mark Phillips on 2/21/2013 11:20 PM
Nice clear explanation. Thanks! You have a talent!
Gravatar # re: Node.js Adventure - Node.js on Windows
Posted by Rahul on 3/19/2013 3:25 PM
Awesome post simple and precise.
Gravatar # re: Node.js Adventure - Node.js on Windows
Posted by Douglas on 6/9/2013 4:46 AM
Very nice post Shaun!
Here on pc i found a problem to run de nodejs on windows seven. On linux works perfect but i would like to setup nodejs on my windows environment. Maybe i have to set some port, i really don't know. When i launch node on prompt running the helloworld.js for example,the response is ... Very nice post Shaun!
Here on pc i found a problem to run de nodejs on windows seven. On linux works perfect but i would like to setup nodejs on my windows environment. Maybe i have to set some port, i really don't know. When i launch node on prompt running the helloworld.js for example,the response is ... Anyone have tip to solve this?
Gravatar # re: Node.js Adventure - Node.js on Windows
Posted by kydimos on 10/9/2013 12:01 AM
Haven't figured out how to configure ghost + node.js + iis6 on Windows Server 2003. Could really need some assistance. Do I need a proxy server or can I run node.js on the side or do it have to go through iss6. Everything works like a charm locally on 127.0.0.1:2368, but when trying to connet from a remote client via iis6 and DNS:80 nothing works.
Gravatar # Simple and what i want
Posted by abdul shaikh on 11/29/2013 8:14 PM
Very nice post Shaun! Nice and clear, simple, awesome
Post A Comment
Title:
Name:
Email:
Comment:
Verification: