SlideShare a Scribd company logo
1 Hour MEAN Stack Hackathon
Valeri Karpov
Software Engineer, MongoDB
www.thecodebarbarian.com
www.slideshare.net/vkarpov15
github.com/vkarpov15
@code_barbarian
Building a Full Stack Single Page App and Workflow
*
Who is this guy?
•Coined the MEAN stack in April ‘13
•Maintains mongoose, omni-di
•Contributor to node-mongodb-native, mquery, etc.
•AngularJS since 0.9.4 in 2010
•Production MEAN apps: Ascot Project, Bookalokal
•Former CTO, LevelUp
*
General Outline
•Building a single page app - LeanMEAN
•Food journal counts calories for you (FitDay)
•MEAN = MongoDB, ExpressJS, AngularJS, NodeJS
•Additional tools:
• browserify
• make
• omni-di
• mongoose
• MongoDB 2.6 text search
• PassportJS / Twitter oauth
*
What we’re building
*
Beyond the Hack
•Nitty-gritty deep dive into code and workflow
•Build tools and workflow: browserify, make
•Code organization: browserify, omni-di
•Unit testing and benchmarks: mocha
*
Step by Step
•Step 0: Understand SR-25 data set
•Step 1: Create Express app
•Step 2: Restructure Express app
•Step 3: Construct Models
•Step 4: Define API
•Step 5: Set up client-side routing
•Step 6: Client-side integration with API
*
Step by Step, Continued
•Step 7: Unit testing
•Step 8: Authentication
*
Follow along on GitHub
*
Step 0: USDA SR-25 Nutrition Data
•Need data: calories, carbs, lipids for common foods
•Thankfully available from USDA’s website
•mongorestore-friendly dump for MongoDB here
•My blog post about the data set
*
What does SR-25 data look like?
*
What Nutrients Look Like
*
What Weights Look Like
*
Simple SR-25 Query
•How many carbs in 1 serving of raw kale?
•Good baby step for food journal
*
Text Search in MongoDB 2.6
•Don’t want users to have to enter “Kale, raw”
•Example: top 3 results for “grass-fed beef”
*
Text Search in MongoDB 2.6
•Static data = perfect use case for text search
•Need to create a text index first from shell:
• db.nutrition.ensureIndex({ description :
“text” });
•Read more here
•Note: mongoose >= 3.8.9 required
*
Step 1: Creating an Express App
•Can create an Express app with 2 commands:
• `npm install express -g` installs Express
• `express lean-mean-nutrition-sample` creates the
app
*
Step 2: Restructuring the App
•Single page app doesn’t need Jade templating
•views folder obsolete
•Set up package.json file
•package.json - workflow for setting up env:
• `git clone`: pull down repo
• `npm install`: install dependencies
• `npm test`: run tests
• `npm start`: start the server
*
passport.json Setup
*
Step 3: Create Database Schema
“Ontology deals with questions concerning what entities
exist or can be said to exist, and how such entities can
be grouped, related within a hierarchy, and subdivided
according to similarities and differences”
- Wikipedia article on ontology
*
Quick Overview of Mongoose
•ODM for MongoDB and NodeJS
•Schema design and validation
•Convenience objects
•MEAN Stack’s official best friend
*
Objects in LeanMEAN World
•FoodItem: from SR-25
•User: because any real API scopes by user
•Day: the FoodItems a User ate on a given date
*
First, SR-25 Nutrition Item Schema
*
Having Users is a Positive
*
Constructing the Day Schema
*
Day Schema Subtleties
•Want to let user select from multiple weights
•Want user to enter custom amount for a weight
•Difference between selectedWeight / weights
•Nutrient amounts per 100G
*
Omni-di to tie this all together
•Avoid dependency hell: don’t require in every file!
*
Omni-di’s `assemble()` function
*
Step 4: Define an API
Complexity creeps up on you like a snake in the grass.
Good thing we have a Mongoose on our side!
*
The API Methods
*
Search for a Food Item
Note: text search API is atypical, docs here
*
Load a Day
*
Save a Day
*
Wait, Where’s The Work?
•Mongoose validates client foods data w/ schema
•Only modifying foods - free access control
•No need to check if date exists: upsert flag
•isNew flag in `GET /api/date/:date`
*
Step 5: AngularJS + Browserify
•Single Page App: how to manage code bloat?
*
Browserify = Write Node For Client
•AngularJS dependency in package.json
•Never deal with flakey CDNs again!
*
Build Process with Browserify
•Output: all.js, contains all JS in 1 file
•Input: all files in client directory + dependencies
•browserify -o ./public/javascripts/all.js
client/*
•Or, make build_client
*
Single Page App Basics
*
What index.html Looks Like
ng-view is where the magic happens
*
http://localhost:3000/#/
*
http://localhost:3000/#/track
*
Why Single Page App?
•No server side templating:
• Better server throughput
• Cleaner separation of concerns
• Less bandwidth usage
•More control over UX
*
Step 6: Let’s Build a Client!
•AngularJS controller for each particular view
•Right now only need TrackController
•Controller talks to server
•Controller provides API for UI
*
Modifying the AngularJS Module
*
TrackController Structure
*
TrackController API
*
TrackController in the HTML
*
Implementation of loadDay()
*
Implementation of recalculate() ?
*
Code Sharing - calculations.js
*
NodeJS SPA and Code Sharing
•Code sharing is trivial with browserify
•MEAN stack principle: The objects your server deals
with should be almost identical to the objects your client
deals with and the objects stored in your database.
•Same objects => easy code sharing
•Calculations a good candidate in this case
*
search() call
*
addFood() call
*
Step 7: Unit Testing with Kittens
*
Get Serious About Testing
•Foundation: proper unit tests, automation
•Heuristic: code “works” iff npm test succeeds
•Grunt or Makefile, either works well
*
Omni-di and unit tests
•Beauty of DI: easy to control how much to stub
•For unit tests, stub everything
*
Testing PUT /api/day/:date
*
Testing PUT /api/day/:date
*
Testing TrackController
*
Testing TrackController
*
Tying Tests Together with make
*
Browserify SPA Testing Advantages
•Code sharing
•Single test framework - Mocha
*
Step 8: Authentication
•Last step!
*
Authentication in SPA
•PassportJS makes oauth easy
•But… requires redirect
•Not that much of a problem
•Handle cases where user hits API but not logged in
*
Setting up app.js with Passport
*
checkLogin middleware
*
checkLogin and TrackController
*
Passport Setup
*
Client-side User Tracking
*
Displaying the Logged In User
*
And that’s a wrap! Time to Review
•Single page app with MEAN stack
•AngularJS routing
•Browserify for building client code
•Twitter Oauth
•Elegant MongoDB features
*
And that’s a wrap! Time to Review
•Mongoose = work-free API (with right schema!)
•MongoDB 2.6 text search
*
Thanks for Listening!
•Slides on:
• Twitter: @code_barbarian
• Slideshare: slideshare.net/vkarpov15
•Repo on github: github.com/vkarpov15/lean-mean-
nutrition-sample
•Blog post on SR-25 data set

More Related Content

PDF
MEAN Stack Workshop at Node Philly, 4/9/14
PDF
MEAN Stack WeNode Barcelona Workshop
ZIP
Drupal, Android and iPhone
PPTX
In-browser storage and me
PPTX
[Blibli Brown Bag] Nodejs - The Other Side of Javascript
PDF
TDD a REST API With Node.js and MongoDB
PDF
Firebase slide
PPTX
Django rest framework
MEAN Stack Workshop at Node Philly, 4/9/14
MEAN Stack WeNode Barcelona Workshop
Drupal, Android and iPhone
In-browser storage and me
[Blibli Brown Bag] Nodejs - The Other Side of Javascript
TDD a REST API With Node.js and MongoDB
Firebase slide
Django rest framework

What's hot (19)

PDF
jQuery and the W3C
PDF
Holistic JavaScript Performance
PDF
New Features Coming in Browsers (RIT '09)
PDF
MongoDB and Node.js
PPTX
PHP Indonesia - Nodejs Web Development
PDF
Afrimadoni the power of docker
PPTX
Django framework
PPTX
Building Your First App with MongoDB
PDF
Modern frontend workflow
PDF
John Resig Beijing 2010 (English Version)
PPTX
Enough with the JavaScript already!
PDF
Queue Everything and Please Everyone
PDF
Getting Started With Grunt for WordPress Development
PDF
node.js 실무 - node js in practice by Jesang Yoon
PDF
Web Development with NodeJS
PPTX
Windows Azure Web Sites - Things they don’t teach kids in school - BuildStuffLT
PDF
Introduction to Node.js
PPTX
Cut your hair and get an azure webjob
PPTX
Webpack and Web Performance Optimization
jQuery and the W3C
Holistic JavaScript Performance
New Features Coming in Browsers (RIT '09)
MongoDB and Node.js
PHP Indonesia - Nodejs Web Development
Afrimadoni the power of docker
Django framework
Building Your First App with MongoDB
Modern frontend workflow
John Resig Beijing 2010 (English Version)
Enough with the JavaScript already!
Queue Everything and Please Everyone
Getting Started With Grunt for WordPress Development
node.js 실무 - node js in practice by Jesang Yoon
Web Development with NodeJS
Windows Azure Web Sites - Things they don’t teach kids in school - BuildStuffLT
Introduction to Node.js
Cut your hair and get an azure webjob
Webpack and Web Performance Optimization
Ad

Viewers also liked (10)

PDF
MongoDB Miami Meetup 1/26/15: Introduction to WiredTiger
PDF
Mongo db in 3 minutes BoilerMake
PDF
AngularJS Meetup 11/19/13 - AngularJS for MongoDB Continuous Integration
PDF
Conquering AngularJS Limitations
PDF
MongoDB Israel June Meetup
PDF
JS-IL Keynote: MongoDB 2.6, Mongoose 4.0, and Beyond
PDF
Lessons in Open Source from the MongooseJS ODM
PDF
MongoDB: Queries and Aggregation Framework with NBA Game Data
PDF
NodeSummit - MEAN Stack
PDF
Nimrod: MongoDB Shell in NodeJS (JSConfUY 2015)
MongoDB Miami Meetup 1/26/15: Introduction to WiredTiger
Mongo db in 3 minutes BoilerMake
AngularJS Meetup 11/19/13 - AngularJS for MongoDB Continuous Integration
Conquering AngularJS Limitations
MongoDB Israel June Meetup
JS-IL Keynote: MongoDB 2.6, Mongoose 4.0, and Beyond
Lessons in Open Source from the MongooseJS ODM
MongoDB: Queries and Aggregation Framework with NBA Game Data
NodeSummit - MEAN Stack
Nimrod: MongoDB Shell in NodeJS (JSConfUY 2015)
Ad

Similar to JS-IL: Getting MEAN in 1 Hour (20)

PDF
Developing and Testing a MongoDB and Node.js REST API
PPTX
Webinar: Get Started with the MEAN Stack
PDF
MongoDB at Gilt Groupe
PPTX
Develop a Basic REST API from Scratch Using TDD with Val Karpov
PPTX
Develop a Basic REST API from Scratch Using TDD with Val Karpov
PDF
From MEAN to the MERN Stack
PDF
MongoDB MEAN Stack Webinar October 7, 2015
PDF
Mongodb at-gilt-groupe-seattle-2012-09-14-final
PDF
Escaping the yellow bubble - rewriting Domino using MongoDb and Angular
PPTX
AngularJS One Day Workshop
PPTX
Rapid Application Development on Google App Engine for Java
PPTX
Node.js Dublin Meetup April 2014
PPTX
Migrating from MongoDB to Neo4j - Lessons Learned
PPTX
Xamarin.Forms Bootcamp
KEY
Building production-quality apps with Node.js
PPTX
Node.js Development with Apache NetBeans
PPT
ASP.net web api Power Point Presentation
PDF
Intro to CakePHP
PDF
The MEAN Stack
PPTX
Iac d.damyanov 4.pptx
Developing and Testing a MongoDB and Node.js REST API
Webinar: Get Started with the MEAN Stack
MongoDB at Gilt Groupe
Develop a Basic REST API from Scratch Using TDD with Val Karpov
Develop a Basic REST API from Scratch Using TDD with Val Karpov
From MEAN to the MERN Stack
MongoDB MEAN Stack Webinar October 7, 2015
Mongodb at-gilt-groupe-seattle-2012-09-14-final
Escaping the yellow bubble - rewriting Domino using MongoDb and Angular
AngularJS One Day Workshop
Rapid Application Development on Google App Engine for Java
Node.js Dublin Meetup April 2014
Migrating from MongoDB to Neo4j - Lessons Learned
Xamarin.Forms Bootcamp
Building production-quality apps with Node.js
Node.js Development with Apache NetBeans
ASP.net web api Power Point Presentation
Intro to CakePHP
The MEAN Stack
Iac d.damyanov 4.pptx

More from Valeri Karpov (10)

PDF
A Practical Introduction to GeoJSON
PDF
A Practical Introduction to Functions-as-a-Service
PDF
A Gentle Introduction to Functions-as-a-Service
PDF
Introducing Async/Await
PDF
TAO and the Essence of Modern JavaScript
PDF
Mastering Async/Await in JavaScript
PDF
React, Redux, and Archetype
PDF
MEAN Stack NYC Meetup 20150717: TDD Your AngularJS + Ionic Directives With jQ...
PDF
MongoDB API Talk @ HackPrinceton
PDF
MEAN Stack - Google Developers Live 10/03/2013
A Practical Introduction to GeoJSON
A Practical Introduction to Functions-as-a-Service
A Gentle Introduction to Functions-as-a-Service
Introducing Async/Await
TAO and the Essence of Modern JavaScript
Mastering Async/Await in JavaScript
React, Redux, and Archetype
MEAN Stack NYC Meetup 20150717: TDD Your AngularJS + Ionic Directives With jQ...
MongoDB API Talk @ HackPrinceton
MEAN Stack - Google Developers Live 10/03/2013

Recently uploaded (20)

PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
cuic standard and advanced reporting.pdf
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Encapsulation theory and applications.pdf
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
DOCX
The AUB Centre for AI in Media Proposal.docx
PPTX
Cloud computing and distributed systems.
PDF
Electronic commerce courselecture one. Pdf
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Empathic Computing: Creating Shared Understanding
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPTX
sap open course for s4hana steps from ECC to s4
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
Network Security Unit 5.pdf for BCA BBA.
cuic standard and advanced reporting.pdf
NewMind AI Weekly Chronicles - August'25 Week I
Encapsulation theory and applications.pdf
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Advanced methodologies resolving dimensionality complications for autism neur...
The AUB Centre for AI in Media Proposal.docx
Cloud computing and distributed systems.
Electronic commerce courselecture one. Pdf
20250228 LYD VKU AI Blended-Learning.pptx
MIND Revenue Release Quarter 2 2025 Press Release
Building Integrated photovoltaic BIPV_UPV.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Empathic Computing: Creating Shared Understanding
Dropbox Q2 2025 Financial Results & Investor Presentation
sap open course for s4hana steps from ECC to s4
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Review of recent advances in non-invasive hemoglobin estimation
Mobile App Security Testing_ A Comprehensive Guide.pdf

JS-IL: Getting MEAN in 1 Hour