Web Development with MongoDB and Node.js
上QQ阅读APP看书,第一时间看更新

Node.js changed JavaScript forever

Back in 2009, Ryan Dahl gave a presentation at JSConf that changed JavaScript forever. During his presentation, he introduced Node.js to the JavaScript community, and after a roughly 45-minute talk, he concluded it, receiving a standing ovation from the audience in the process. He was inspired to write Node.js after he saw a simple file upload progress bar on Flickr, the image-sharing site. Realizing that the site was going about the whole process the wrong way, he decided that there had to be a better solution.

As stated on the Node.js homepage, the goal of Node is to provide an easy way to build scalable network programs. It achieves this by providing an event-driven, nonblocking IO model that is extremely lightweight. Compared to traditional web-serving technologies that require a new CPU thread for every connection to the server that would eventually max out the systems resources, Node instead uses a single thread but doesn't block the I/O of the CPU. Thus, this allows Node to support tens of thousands of concurrent connections. It's for this very reason that Node is so popular with high-traffic web applications.

To see an example of just how lightweight Node can be, let's take a look at some sample code that starts up an HTTP server and sends Hello World to a browser:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(8080, 'localhost');
console.log('Server running at http://localhost:8080');

A few basic lines of code are all it takes to write a complete Node application. Running it with a simple node app.js command will launch an HTTP server that is listening on port 8080. Point any browser to http://localhost:8080, and you will see the simple output Hello World on your screen! While this sample app doesn't actually do anything useful, it should give you a glimpse of the kind of power you will have while writing web applications using Node.js.

At its core, Node is very low-level. It consists of a small set of modules that do very specific things and do them very well. These modules include tools to work with the file system, networking with TCP and HTTP, security, and streams.

Asynchronous callbacks

One of the most powerful features of Node is that it is event-driven and asynchronous. Code gets executed via callback functions whenever an event is broadcast. Simply put, you assign a callback function to an event, and when Node determines that the event has been fired, it will execute your callback function at that moment. No other code will get blocked waiting for an event to occur. Consider the following example to see asynchronous callbacks in action:

console.log('One');
console.log('Two');
setTimeout(function() {
    console.log('Three');
}, 2000);
console.log('Four');
console.log('Five');

Tip

Downloading the example code

You can download the example code files for all Packt books you have purchased from your account at http://www.packtpub.com. If you purchased this book elsewhere, you can visit http://www.packtpub.com/support and register to have the files e-mailed directly to you.

In a typical synchronous programming language, executing the preceding code will yield the following output:

One
Two
... (2 second delay) ...
Three
Four
Five

However, in JavaScript and Node, the following output is seen:

One
Two
Four
Five
... (approx. 2 second delay) ...
Three

The function that actually logs Three is known as a callback to the setTimeout function.

Node Package Manager

Writing applications with Node is really enjoyable when you realize the sheer wealth of information and tools at your disposal! Using Node's built-in package manager npm, you can find literally tens of thousands of modules that can be installed and used within your application with just a few keystrokes! You can view the library of available modules by visiting http://npmjs.org. Downloading and installing any module within your application is as simple as executing the npm install package command. Have you written a module that you want to share with the world? Package it up using npm, and upload it to the public npmjs.org registry just as easily! Not sure how a module works that you downloaded and installed? The source code is right there in your projects' node_modules/ folder waiting to be explored!

Networking and file IO

In addition to the powerful nonblocking asynchronous nature of Node, it also has very robust networking and filesystem tools available via its core modules. With Node's networking modules, you can create server and client applications that accept network connections and communicate via streams and pipes.

Not just on the web

Node isn't just for web development! It can be a powerful solution to create command-line tools as well as full-featured locally run applications that have nothing to do with the Web or a browser. Grunt.js is a great example of a Node-powered command-line tool that many web developers use daily to automate everyday tasks such as build processes, compiling CoffeeScript, launching Node servers, running tests, and more.

In addition to command-line tools, Node has recently become increasingly popular among the hardware crowd with the Nodebots movement. Johnny-Five and Cylon.js are two popular Node libraries that exist to provide a framework to work with robotics.

Real-time web with Socket.io

Node achieves real-time communication with Socket.io. Using Socket.io, you can create features such as instant collaboration, which is similar to multiuser editing in Google Docs. What was once achieved using cumbersome (and not real-time) long polling can now be achieved using WebSockets. While WebSockets is a feature that is only supported in modern browsers, Socket.io also features seamless fallback implementations for legacy browsers.

Using this lightweight core, everything else is left to the developer—but don't let that scare you. The beauty of working with Node is that there is a thriving community developing and releasing modules every day via npm. As of this writing, npm has over 61,000 packages available! Throughout this book, we will use some of the most popular packages that help make writing web applications fun and easy!