MongoDB MEAN Stack Webinar October 7, 2015
-
Upload
valeri-karpov -
Category
Technology
-
view
526 -
download
0
Transcript of MongoDB MEAN Stack Webinar October 7, 2015
Valeri KarpovNode.js Engineer, MongoDBwww.thecodebarbarian.com
github.com/vkarpov15@code_barbarian
*
•MongoDB is great for storing web/mobile app data
•So let’s build a REST API using Node.js!
•+ learn a bit about test-driven dev with Node.js
•+ learn two MongoDB schema design principles
•Server-side only - just JSON, no HTML
•No AngularJS part, focus more on MongoDB
•Upcoming EdX course
*
•Part 1: Shopping Cart Application• Search for products
• Add them to your cart
• Check out with Stripe
•Part 2: Using the Mongoose ODM
•Part 3: Schema Design
•Part 4: Building an API with the Express framework
•Part 5: Testing with Mocha + Superagent
*
*
*
*
•"Bad programmers worry about the code. Good programmers worry about data structures and their relationships." - Linus Torvalds
•3 schemas for 3 collections:
•Products
•Categories
•Users
*
•Product belongs to one or more categories
•Users can have multiple products in their cart
•Representing relationships in MongoDB is tricky
•But that’s what mongoose is for
*
•“Object document mapper” (like ORM, but for MongoDB)
•“MongoDB object modeling designed to work in an asynchronous environment”
•Written for Node.js
•Provides schema validation, pseudo-JOINs, etc.
*
•require()
● Async I/O
*
Register eventhandler
In node.js, you don’t execute I/O imperatively.
You register a callback to execute when the I/O is done
Prints before“done reading”
*
matches [email protected]
*
Create User
Save user to MongoDB
Load user from MongoDB
Print user to stdout
*
•Mongoose provides several neat features• Model part of MVC
• Default values
• Schema validation and declarative schema design
*
•3 schemas:• Product
• Category
• User
•Going to use mongoose to define schemas
•Will use a couple key schema design principles
*
*
*
*
•What categories are descendants of “Electronics”?
•
•
•What categories are children of “Non-Fiction”?
•
•What categories are ancestors of “Phones”?
*
*
•Queries in MongoDB should be simple
•Strive for minimal data transformation by server
•“Store what you query for”
•“If you need [the aggregation framework in a heavily used API endpoint], you're screwed anyway, and should fix your program.” - Linus Torvalds
•Good for performance and developer sanity
*
User’s cart as an arrayof ObjectIds...
*
•Product and user = many-to-many relationship
•Don’t necessarily need a mapping table
•User won’t have 1000s of products in cart
•Can represent relationship as array in user since one side is small
•If one side of many-to-many is bounded and/or small, it is a good candidate for embedding
•Arrays that grow without bound are an antipattern!• 16mb document size limit
• network overhead
*
•Most popular Node.js web framework
•Simple, pluggable, and fast
•Great tool for building REST APIs
*
Route Parameter
*
•Representational State Transfer
•HTTP request -> JSON HTTP response
•Business logic on top of MongoDB schemas• Access control, emails, analytics, etc.
*
*
Find Category
Error handling
Output JSON
*
*
*
•Recall cart is an array of products
*
Get cart from HTTP request
Overwrite user’s cart
Let mongoose handlecasting and validating data
*
•Mongoose lets you be lazy
•Access control using subdocs
*
Create a Stripe charge with the npm ‘stripe’ module
*
Error handling
Empty user carton success
*
•Express REST API on top of mongoose• Access control
• Business logic
• Define what operations user can take on database
•Mongoose casting and validation for APIs
*
•Building an API is tricky
•Lots of different error conditions
•Express has a lot of magic under the hood
*
•Node.js runs in an event loop
•Single threaded
•Can run client and server on same thread!• Client sends HTTP request
• Client registers a callback awaiting the result
• Server’s “on HTTP request” event handler is triggered
• Server sends response, continues waiting for events
• Client’s callback gets fired
•Test server end-to-end
*
•NodeJS HTTP client
•Isomorphic: runs in both browser and NodeJS
•Same author as Express
*
•Testing Framework for NodeJS
•Same author as Express
•BDD-style syntax• describe() -> test suite
• it() -> individual test
*
*
*
•NodeJS concurrency makes testing easy
•Not just unit tests - full E2E for your REST API
•Can manipulate database and make arbitrary HTTP requests
*
•Upcoming EdX Video Course
•Slides on http://www.slideshare.net/vkarpov15
•Looking for beta testers! Sign up for notifications• http://goo.gl/forms/0ckaJ4YvJN
•Interested in learning about AngularJS?• Professional AngularJS on Amazon
•More NodeJS+MongoDB content at:• www.thecodebarbarian.com
• Twitter: @code_barbarian