Mongoose for Application Development Learn to speed up your application development by using Mongoose to harness the power of Node.js and MongoDB Simon Holmes BIRMINGHAM - MUMBAI Mongoose for Application Development Copyright © 2013 Packt Publishing All rights reserved. No part of this book may be reproduced, stored in a retrieval system, or transmitted in any form or by any means, without the prior written permission of the publisher, except in the case of brief quotations embedded in critical articles or reviews. Every effort has been made in the preparation of this book to ensure the accuracy of the information presented. However, the information contained in this book is sold without warranty, either express or implied. Neither the author, nor Packt Publishing, and its dealers and distributors will be held liable for any damages caused or alleged to be caused directly or indirectly by this book. Packt Publishing has endeavored to provide trademark information about all of the companies and products mentioned in this book by the appropriate use of capitals. However, Packt Publishing cannot guarantee the accuracy of this information. First published: August 2013 Production Reference: 1200813 Published by Packt Publishing Ltd. Livery Place 35 Livery Street Birmingham B3 2PB, UK. ISBN 978-1-78216-819-5 www.packtpub.com Cover Image by Abhishek Pandey ([email protected]) Credits Author Project Coordinator Simon Holmes Joel Goveya Reviewers Proofreader Alexandru Vlăduțu Mario Cecere Robert Klep David Harvey Indexer Hemangini Bari Acquisition Editor Grant Mizen Production Coordinator Aditi Gajjar Commisioning Editor Llewellyn Rozario Cover Work Aditi Gajjar Technical Editor Akashdeep Kundu About the Author Simon Holmes started his journey as a web developer in late 1990s. He built his first website for a project at university and soon saw what the industry had to offer when he promptly sold it! Following university, Simon worked his way through the ranks of design agency life, learning the skills of becoming a full-stack web developer. From server management and database design to building dynamic, UIs from Photoshop files, it all fell under Simon's remit. Having witnessed first-hand the terrible JavaScript code so prevalent in the early 2000s Simon is very much enjoying its resurgence as a powerful, structured language. Simon now works in SaaS, which is very heavy on the JavaScript. Firstly I would like to thank my wife Sally for taking increased duties with our two lovely young daughters Eri and Bel, affording me some peace and quiet in which to code and write. Thanks also to Andreas Soellner for his feedback and encouragement throughout the process, and technical reviewers David Harvey of Vyclone Inc., Robert Klep, and Alexandru Vlăduțu. I also wish to express my thanks to the team at Packt Publishing who have been open and helpful from start to finish. Not forgetting of course Aaron Heckman who created Mongoose and continues to maintain, support, and push it forward. About the Reviewers David Harvey has built tools for more than twenty five years for developers, architectural infrastructure for investment banks, and high-end music software. He has formed and led teams in organizations of all sizes, and has taught, consulted, and presented on object technology, patterns and agile software development. He is currently the CTO at Vyclone Inc., delivering ground-breaking multi-angle video technology on mobile and cloud platforms. Robert Klep is a freelance frontend and backend web developer from 's-Hertogenbosch, the Netherlands, with more than 17 years experience. Lately, Robert has been focusing more on JavaScript and Node.js development. He has used Mongoose extensively in several projects. He was the winner of the 0th Annual Obfuscated Perl Contest in 1996. Alexandru Vlăduțu is a JavaScript developer at a company in Bucharest, Romania. He started creating applications with PHP five years ago, but after finding out about server-side JavaScript with Node.js he never had to switch technologies again. You may have seen him answering questions on stackoverflow.com under the nickname alessioalex, where he is in the top three overall answerers for tags like Node.js, Express, Mongoose, or Socket.IO. By day he battles cross browser compatibility issues, but by night he brings together embedded databases, servers, and caching layers into single applications using the good parts of JavaScript. Aside from the geeky stuff, he enjoys spending time with his wife. I would like to thank the Node.js community for being so friendly and helpful. Most importantly, I would like to thank my wife Diana for her support, encouragement, and patience. www.PacktPub.com Support files, eBooks, discount offers and more You might want to visit www.PacktPub.com for support files and downloads related to your book. Did you know that Packt offers eBook versions of every book published, with PDF and ePub files available? You can upgrade to the eBook version at www.PacktPub. com and as a print book customer, you are entitled to a discount on the eBook copy. Get in touch with us at [email protected] for more details. At www.PacktPub.com, you can also read a collection of free technical articles, sign up for a range of free newsletters and receive exclusive discounts and offers on Packt books and eBooks. TM http://PacktLib.PacktPub.com Do you need instant solutions to your IT questions? PacktLib is Packt's online digital book library. Here, you can access, read and search across Packt's entire library of books. Why Subscribe? • Fully searchable across every book published by Packt • Copy and paste, print and bookmark content • On demand and accessible via web browser Free Access for Packt account holders If you have an account with Packt at www.PacktPub.com, you can use this to access PacktLib today and view nine entirely free books. Simply use your login credentials for immediate access. Table of Contents Preface 1 Chapter 1: Introducing Mongoose to the Technology Stack 7 The technology stack – Node.js, npm, MongoDB, and Express 7 The language and the server – JavaScript and Node 7 Single-threaded versus multithreaded 8 Blocking versus non-blocking code 9 The database – MongoDB 11 The framework – Express 12 What Mongoose is all about 12 What is Mongoose good for? 13 What Mongoose is not ideally suited for 13 The cornerstones of Mongoose 14 Mongoose schemas 14 Mongoose models 14 Installing the full stack 15 Installing the prerequisites 15 Installing Node.js 15 Installing npm 15 Installing MongoDB 16 Installing Express.js 17 Installing Mongoose 17 Direct installation into project 17 Using project dependencies – package.json 17 Creating a project 18 Summary 21 Chapter 2: Establishing a Database Connection 23 Mongoose default connection 23 Using multiple connections 24 Table of Contents About the connection string 24 Setting the port 24 Specifying a database user 24 Connection options 24 Closing the connection 25 Calling the close command 25 Closing when the Node process ends 26 Connection events 26 Connecting our project 26 Creating the connection 26 Catching the events 27 Opening the connection at application start 28 Creating the database 28 Summary 29 Chapter 3: Schemas and Models 31 Introducing schemas 31 Field sizes 32 Data types allowed in schemas 32 String 32 Number 33 Date 33 Boolean 33 Buffer 33 ObjectId 33 Mixed 33 Tracking changes to Mixed type 34 Array 34 Warning – array defined as mixed type 34 Custom SchemaTypes 35 Where to write the schemas 35 Writing a schema 35 Modifying an existing schema 36 Setting a default value 36 Only allowing unique entries 37 Our final User schema 38 What's that "__v" thing? 38 Why is this needed? 38 Defining the Project schema 39 Improving the Project schema 40 Building models 40 [ ii ] Table of Contents Instances 40 Interacting with instances 41 Finding a single instance 41 Finding many instances 41 Considerations when choosing your model name 42 Setting the collection name 42 Overriding the collection name in the schema 42 Overriding the collection name in the model 43 Building models from our schemas 43 Our complete code 44 Summary 45 Chapter 4: Interacting with Data – an Introduction 47 Model methods and instance methods 47 Setting up the project 48 Code structure 48 Adding the routes files 49 Tying the routes to Mongoose models 49 URLs and routes 49 Routes for user management 50 Routes for project management 50 Summary 51 Chapter 5: Interacting with Data – Creation 53 Creating an instance 53 Adding data to the instance 54 Saving an instance 54 Using the saved data 55 Creating and saving database entry in one step 56 Chaining methods 56 The Model.create() method 56 CRUD – create data 57 Adding a new user form 58 Adding the Jade template 58 Linking the view to the URL 59 Adding the create user function 60 Error trapping 62 Creating a user session 62 Displaying the confirmation page 63 Try it out! 64 Adding create project functionality 64 Routes 64 New files and functions 65 Summary 65 [ iii ]