www.it-ebooks.info www.it-ebooks.info Node: Up and Running Tom Hughes-Croucher and Mike Wilson Beijing • Cambridge • Farnham • Köln • Sebastopol • Tokyo www.it-ebooks.info Node: Up and Running by Tom Hughes-Croucher and Mike Wilson Copyright © 2012 Tom Hughes-Croucher, Mike Wilson. All rights reserved. Printed in the United States of America. Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472. O’Reilly books may be purchased for educational, business, or sales promotional use. Online editions are also available for most titles (http://my.safaribooksonline.com). For more information, contact our corporate/institutional sales department: (800) 998-9938 or [email protected]. Editors: Andy Oram and Simon St.Laurent Indexer: Lucie Haskins Production Editor: Kristen Borg Cover Designer: Karen Montgomery Copyeditor: Genevieve d’Entremont Interior Designer: David Futato Proofreader: Rachel Monaghan Illustrators: Robert Romano and Rebecca Demarest May 2012: First Edition. Revision History for the First Edition: 2012-04-20 First release See http://oreilly.com/catalog/errata.csp?isbn=9781449398583 for release details. Nutshell Handbook, the Nutshell Handbook logo, and the O’Reilly logo are registered trademarks of O’Reilly Media, Inc. Node: Up and Running, the image of a common tree shrew, and related trade dress are trademarks of O’Reilly Media, Inc. Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this book, and O’Reilly Media, Inc., was aware of a trademark claim, the designations have been printed in caps or initial caps. While every precaution has been taken in the preparation of this book, the publisher and authors assume no responsibility for errors or omissions, or for damages resulting from the use of the information con- tained herein. ISBN: 978-1-449-39858-3 [LSI] 1334953364 www.it-ebooks.info Table of Contents Foreword by Ryan Dahl ....................................................... vii Foreword by Brendan Eich ..................................................... ix Preface ..................................................................... xi Part I. Up and Running 1. A Very Brief Introduction to Node.js ........................................ 3 Installing Node.js 4 First Steps in Code 7 Node REPL 7 A First Server 9 Why Node? 11 High-Performance Web Servers 11 Professionalism in JavaScript 12 Browser Wars 2.0 13 2. Doing Interesting Things ................................................ 15 Building a Chat Server 15 Let’s Build Twitter 23 3. Building Robust Node Applications ....................................... 33 The Event Loop 33 Patterns 40 The I/O Problem Space 40 Writing Code for Production 45 Error Handling 46 Using Multiple Processors 47 iii www.it-ebooks.info Part II. Deep Dive and API Reference 4. Core APIs ............................................................. 55 Events 55 EventEmitter 56 Callback Syntax 57 HTTP 59 HTTP Servers 59 HTTP Clients 61 URL 65 querystring 67 I/O 68 Streams 68 Filesystem 69 Buffers 70 console.log 76 5. Helper APIs ........................................................... 77 DNS 77 Crypto 79 Hashing 79 HMAC 81 Public Key Cryptography 82 Processes 86 process Module 86 Child Process 94 Testing Through assert 101 VM 104 6. Data Access .......................................................... 107 NoSQL and Document Stores 107 CouchDB 107 Redis 115 MongoDB 123 Relational Databases 127 MySQL 127 PostgreSQL 134 Connection Pooling 137 MQ Protocols 139 RabbitMQ 140 iv | Table of Contents www.it-ebooks.info 7. Important External Modules ............................................ 145 Express 145 A Basic Express App 145 Setting Up Routes in Express 146 Handling Form Data 151 Template Engines 152 Middleware 155 Socket.IO 159 Namespaces 161 Using Socket.IO with Express 163 8. Extending Node ...................................................... 169 Modules 169 Package Manager 169 Searching Packages 170 Creating Packages 170 Publishing Packages 171 Linking 171 Add-ons 172 Glossary ................................................................... 173 Index ..................................................................... 175 Table of Contents | v www.it-ebooks.info www.it-ebooks.info Foreword by Ryan Dahl In 2008 I was searching for a new programming platform for making websites. This was more than wanting a new language; indeed, the details of the language mattered very little to me. Rather, I was concerned about the ability to program advanced push features into the website like I had seen in Gmail—the ability for the server to push data to the user instead of having to constantly poll. The existing platforms were tightly coupled to the idea of the server as something that receives a request and issues a response sequentially. To push events to the browser, the platform needed to be able to constantly handle a number of open and mostly idle connections. I knew how to make this work at the system call layer, in C. If I used only nonblocking sockets, the overhead per connection was very small. In small tests, I could demonstrate a server that could handle thousands of idle connections or pretty massive throughput. I knew that this was the optimal way for a user-space Unix server to be implemented. However, I didn’t want to work in C; I wanted the beautiful fluidness of a dynamic language. Although it was possible to issue the exact system calls I wanted in every programming language, it was very ugly and was always the “alternative” method of socket programming. My theory was that nonblocking sockets were not actually diffi- cult at all, as long as everything was nonblocking. Google announced Chrome and its new JavaScript engine V8 in late 2008. A faster JavaScript engine made for a faster Web—and V8 made the Web a lot faster. Suddenly there was this idea of a JavaScript arms race between Google, Apple, Mozilla, and Microsoft. This, combined with Doug Crockford’s book JavaScript: The Good Parts (O’Reilly), shifted JavaScript from the language everyone despised to an important language. I had an idea: nonblocking sockets in JavaScript! Because JavaScript has no existing socket libraries, I could be the first to introduce this new and hopefully better interface. Just take V8 and glue it to my nonblocking C code, and I should be done. I quit my contracting job and began working on this idea full time. Once I made the very first version available, I immediately had users who reported bugs; I started fixing those bugs, and then three years passed. vii www.it-ebooks.info It turns out that JavaScript jibes extremely well with nonblocking sockets. This was not clear from the start. The closures made everything possible. People were able to build very complex nonblocking servers in just a couple of lines of JavaScript. My initial fear that the system would be unusably niche was quickly alleviated as hackers from all over the world began to build libraries for it. The single event loop and pure non- blocking interface allowed libraries to add more and more complexity without intro- ducing expensive threads. In Node, users find a system that scales well by default. Because of the choices made in the core system, nothing in the system is allowed to do anything too terrible (such as block the current thread), and thus performance never degrades horribly. It is an order of magnitude better than the traditional blocking approach, where “better” is defined as the amount of traffic it can handle. These days, Node is being used by a large number of startups and established companies around the world, from Voxer and Uber to Walmart and Microsoft. It’s safe to say that billions of requests are passing through Node every day. As more and more people come to the project, the available third-party modules and extensions grow and increase in quality. Although I was once reserved about recommending it for mission-critical applications, I now heartily recommend Node for even the most demanding server systems. This book gracefully takes the reader through a discussion of and guided exercises for Node and many third-party modules. By learning the material covered here, you go from basic familiarity with JavaScript to building complex, interactive websites. If you’ve used other server-side web frameworks in the past, you’ll be shocked at how easy it is to build a server in Node. —Ryan Dahl, creator of Node.js viii | Foreword by Ryan Dahl www.it-ebooks.info