Parse and Cloud Code
Node.pgh - 0.16 meetup
Nicholas McClay
UX Developer

@nickmcclay
What is

?
“Parse's vision is to let developers
build any mobile app without
dealing with servers.”
a suite of tools to replace or support	

your app’s backend

Parse Data

Parse Push

Parse Social Parse Analytics Parse Ho...
Getting Started with Parse
Acquire Keys
1.

Sign Up

2.

3.

Pick Your
Platform
1.

Sign Up with Parse
https://www.parse.com/#signup

Sign Up

App + Optional Info

Intro Documentation
2.

Parse Account Page

Acquire Keys

Application Keys
‘Key’ Details
•

Main ID (always needed)	


•

iOS & Android Key	


•

Windows 8 & Phone Key	


•

Node + Client Side JS K...
3.

Pick Your Platform
I choose you

Parse API Platforms

!
+
Generate an Express App
yo express

Install Parse module
npm install parse

Run Server
grunt
Alternative Node-Parse Modules
“IMPORTANT NOTE: This api is not currently maintained. If
I were starting a parse project t...
Quick-Start
https://parse.com/apps/quickstart#js/native/blank

Import and Initialize Parse Module


var Parse = require('p...
Parse Suite Overview
Pick your problem
Parse Data

Store your app’s data in the cloud. No servers necessary.
https://parse.com/products/data
Parse Data Objects
Data is schema-less
Automatic objectId, createAt and modifiedAt fields
Objects can be extended from other...
Object API
https://www.parse.com/docs/js_guide#objects
var Class = Parse.Object.extend("ClassName");

var item = new Class...
Object Methods
•

save(params,callback) - save params to your object	


•

fetch(callbacks) - refresh an object	


•

set(...
Query API
Retrieve many objects at once, put conditions on the objects
you wish to retrieve, and more

var GameScore = Par...
Query Methods
•

get(objectId,callbacks) - get one object by ID	


•

find(callbacks) - runs query and returns results	


•...
Object Pointers
One-to-one and one-to-many relationships are modeled by
saving a Parse.Object as a value in the other obje...
Object Relations
Many-to-many relationships are modeled using Parse.Relation.




var
var
var
var

Portfolio = Parse.Objec...
Parse Data Browser
Lots of other Data goodness
Every asynchronous method in the Parse JavaScript SDK
returns a Promise
Object instance and cl...
Parse Push

Creating, scheduling, and segmenting push notifications
https://www.parse.com/products/push
Enabling Push Notifications
To send notifications from the JavaScript SDK outside of Cloud
Code or any of the other client S...
Parse Channels
Allows you to use a publisher-subscriber model for sending pushes.
Parse.Push.send({

channels: [ "Giants",...
Push Options
•

alert- your notification’s message	


•

badge (iOS) - # of pending notifications on your app	


•

sound (i...
Advanced Targeting
While channels are great for many applications, sometimes you need
more precision when targeting the re...
Receiving Pushes…
The JavaScript SDK does not currently support
subscribing iOS and Android devices for pushes

The JavaSc...
Push forward
Scheduling Pushes and expiration dates
Targeting by Platform and Relationships
App Notification Dashboard
Parse Social

Make your app social. Instantly
https://parse.com/products/data
Parse User
Parse.User is a subclass of Parse.Object, and has all the same features
var user = new Parse.User();

user.set(...
User API
•

signUp(params,callback) - create new User	


•

logIn(user,pass,callbacks) - authenticate User	


•

logOut() ...
Setup for Facebook Integration
1.

Setup a Facebook App

2.

Add Facebook JS SDK to your app

3.

Add FB App ID to Parse A...
Facebook Social Sign On
allow your Parse.Users to log in or sign up through Facebook.
Parse.FacebookUtils.logIn("user_like...
Facebook SDK + Node…
https://parse.com/questions/facebook-login-with-the-node-sdk-for-parse

The Facebook JavaScript SDK d...
Getting more Social
Security - roles and ACLs
Email verification and password reset
Twitter, 3rd Party Integration and Acco...
Parse Analytics

Track any data point in your app in real-time
https://www.parse.com/products/analytics
Complimentary Analytics
Developers using Parse Data are automatically instrumented
Custom Analytics
Track free-form events, with a handful of string keys and values
var dimensions = {

priceRange: '1000-15...
Check your Parse module version!
https://parse.com/questions/updates-to-the-parse-package-innpm-appear-infrequent
npm curr...
Parse Hosting

A powerful web presence without all the hassle.
https://www.parse.com/products/hosting
Parse Cloud Code

Add rich, custom logic to your app’s backend without servers.
https://www.parse.com/products/cloud_code
Install Cloud Code
https://parse.com/docs/cloud_code_guide

curl -s https://www.parse.com/downloads/cloud_code/installer.s...
Cloud Code Project
cloud - where you cloud code snippets live
config - where your Parse app config lives
public - where stat...
Parse Deploy

cd MyCloudCode
parse deploy
Uploading source files
Finished uploading files
New release is named v1
Cloud Functions

Cloud functions can be called from any of the client SDKs, as well as
through the REST API
Parse.Cloud.de...
Cloud Functions API
•

run(key,params,callbacks) - All	


•

before/afterSave(class,callbacks) - All	


•

before/afterDel...
Parse Express Server

After you get Parse Hosting set up, you can add dynamic backend
logic to your website by generating ...
Cloud Modules
Cloud Code supports breaking up JavaScript code into modules.
cloud/name.js
var coolNames = ['Ralph', 'Skipp...
Cloud Code limitations…

Doesn’t support npm
Can’t test locally
Can’t debug…
Parse Pricing
Pricing that scales with your needs.
Getting More Help
Official Parse Tutorials
https://www.parse.com/tutorials

JavaScript Guide Documentation
https://parse.co...
Thanks!

@nickmcclay
Node.js and Parse
Upcoming SlideShare
Loading in …5
×

Node.js and Parse

23,615 views

Published on

Parse is a suite of cloud based APIs, services and libraries that focus on letting developers build out rich applications and less time dealing with the overhead of setting up and managing databases, push notifications, social sign on, analytics, and even hosting and servers.

In this series I'll overview the options around developing an application that leverages Parse, including using Cloud Code to deploy your Node.js app to Parse's own hosting service.

Published in: Technology

Node.js and Parse

  1. 1. Parse and Cloud Code Node.pgh - 0.16 meetup
  2. 2. Nicholas McClay UX Developer @nickmcclay
  3. 3. What is ?
  4. 4. “Parse's vision is to let developers build any mobile app without dealing with servers.”
  5. 5. a suite of tools to replace or support your app’s backend Parse Data Parse Push Parse Social Parse Analytics Parse Hosting Cloud Code Backend-as-a-Service (BaaS)
  6. 6. Getting Started with Parse Acquire Keys 1. Sign Up 2. 3. Pick Your Platform
  7. 7. 1. Sign Up with Parse https://www.parse.com/#signup Sign Up App + Optional Info Intro Documentation
  8. 8. 2. Parse Account Page Acquire Keys Application Keys
  9. 9. ‘Key’ Details • Main ID (always needed) • iOS & Android Key • Windows 8 & Phone Key • Node + Client Side JS Key • REST API Key • ‘Sudo’ Key Adheres to Object Level Permissions (ACL) https://parse.com/docs/data#security-objects
  10. 10. 3. Pick Your Platform I choose you Parse API Platforms !
  11. 11. + Generate an Express App yo express Install Parse module npm install parse Run Server grunt
  12. 12. Alternative Node-Parse Modules “IMPORTANT NOTE: This api is not currently maintained. If I were starting a parse project today using node.js, I would probably start out with https://github.com/shiki/kaiseki” npm install node-parse-api A Parse.com REST API client for Node.js npm install kaiseki https://parse.com/docs/rest
  13. 13. Quick-Start https://parse.com/apps/quickstart#js/native/blank Import and Initialize Parse Module 
 var Parse = require('parse').Parse;
 Parse.initialize(“Application ID", “JavaScript Key");
 Save a “TestObject” var TestObject = Parse.Object.extend("TestObject");
 var testObject = new TestObject();
 testObject.save({foo: "bar"}, {
 success: function(object) {
 alert("yay! it worked");
 }
 });
  14. 14. Parse Suite Overview Pick your problem
  15. 15. Parse Data Store your app’s data in the cloud. No servers necessary. https://parse.com/products/data
  16. 16. Parse Data Objects Data is schema-less Automatic objectId, createAt and modifiedAt fields Objects can be extended from other objects (classes) Objects can be relational {
 objectId : "xWMyZ4YEGZ",
 score: 1337,
 playerName : "Sean Plott",
 cheatMode : false,
 createdAt : "2011-06-10T18:33:42Z",
 updatedAt : "2011-06-10T18:33:42Z"
 }
  17. 17. Object API https://www.parse.com/docs/js_guide#objects var Class = Parse.Object.extend("ClassName");
 var item = new Class(); item.method({params},{callbacks}) item.save({"field" : "value"}, {
 success : function(obj) {
 // Execute any logic that should take place after the object is saved.
 },
 error : function(obj,error) {
 // Execute any logic that should take place if the save fails.
 // error is a Parse.Error with an error code and description.
 }
 })
  18. 18. Object Methods • save(params,callback) - save params to your object • fetch(callbacks) - refresh an object • set(field,value)/get(field) - stage params for saving to object • increment/decrement(field,value) - ++ and - - • destroy(callbacks) - delete an object • unset(field) - delete a field • add, addUnique, remove - array specific methods http://www.parse.com/docs/js/symbols/Parse.Object.html
  19. 19. Query API Retrieve many objects at once, put conditions on the objects you wish to retrieve, and more var GameScore = Parse.Object.extend("GameScore");
 var query = new Parse.Query(GameScore);
 query.equalTo("playerEmail", “blazor777@blah.com");
 query.find({
 success: function(object) {
 // Successfully retrieved the object.
 },
 error: function(error) {
 // Handle error
 }
 }); https://www.parse.com/docs/js_guide#queries
  20. 20. Query Methods • get(objectId,callbacks) - get one object by ID • find(callbacks) - runs query and returns results • equalTo, notEqualTo, etc - stage filters for query results • limit(num)/skip(num) - stage range for query results • ascending/descending - stage order for query results • first(callbacks) - like find, but just the first match • count(callbacks) - if you just want to know total of results http://www.parse.com/docs/js/symbols/Parse.Query.html
  21. 21. Object Pointers One-to-one and one-to-many relationships are modeled by saving a Parse.Object as a value in the other object (pointer). 
 var var var var Portfolio = Parse.Object.extend("Portfolio");
 item = new Portfolio();
 Comment = Parse.Object.extend("Comment");
 post = new Comment(); post.save({'message' : "this is great!"},{
 success : function() {
 item.set("comments",[post]);
 item.save();
 }
 });
 Saving an Object pointer {
 ],
 } "comments": [
 {
 "__type": "Pointer",
 "className": "Comment",
 "objectId": "YrLhRXbnfc"
 }
 "objectId": "Z8CarHlfu2",
 "createdAt": "2013-11-05T20:06:59.130Z",
 "updatedAt": "2013-11-05T20:06:59.130Z"
 Pointer Data without being fetched By default, when fetching an object, related Parse.Objects are not fetched. These objects' values cannot be retrieved until they have been fetched
  22. 22. Object Relations Many-to-many relationships are modeled using Parse.Relation. 
 var var var var Portfolio = Parse.Object.extend("Portfolio");
 item = new Portfolio();
 Comment = Parse.Object.extend("Comment");
 post = new Comment(); post.save({'message' : "this is great!"},{
 success : function() {
 var relation = item.relation("comments");
 relation.add(post);
 item.save();
 }
 }); Saving an Object relation var relation = item.relation(“comments"); var query = relation.query(); query.equalTo("author", “Sam"); query.limit(10); " " query().find({
 success: function(list) {
 // list of all relation results
 }
 }); Retrieve relation data using Query API By default, the list of objects in this relation are not downloaded. You can get a list of the posts that a user likes by using the Parse.Query returned by query.
  23. 23. Parse Data Browser
  24. 24. Lots of other Data goodness Every asynchronous method in the Parse JavaScript SDK returns a Promise Object instance and class methods A Parse.Collection is an ordered set of Parse.Objects. It is compatible with Backbone.Collection, and has all the same functionality. Parse.File lets you store application files in the cloud
  25. 25. Parse Push Creating, scheduling, and segmenting push notifications https://www.parse.com/products/push
  26. 26. Enabling Push Notifications To send notifications from the JavaScript SDK outside of Cloud Code or any of the other client SDKs, you will need to set Client Push Enabled in the Push Notifications settings of your Parse app. Flip this to get started
  27. 27. Parse Channels Allows you to use a publisher-subscriber model for sending pushes. Parse.Push.send({
 channels: [ "Giants", "Mets" ],
 data: {
 alert: "The Giants won against the Mets 2-3."
 }
 }, {
 success: function() {
 // Push was successful
 },
 error: function(error) {
 // Handle error
 }
 }); The channels subscribed to by a given Installation are stored in the channels field of the Installation object. Installation Object modification not available in JavaScript SDK
  28. 28. Push Options • alert- your notification’s message • badge (iOS) - # of pending notifications on your app • sound (iOS) - play a sound file in your application bundle • content-available (iOS) - for Newsstand apps • action (android) - Intent to be executed when received • title (android)- displayed in notification tray
  29. 29. Advanced Targeting While channels are great for many applications, sometimes you need more precision when targeting the recipients of your pushes. var query = new Parse.Query(Parse.Installation);
 query.equalTo('channels', 'Pirates'); // Set our channel
 query.equalTo('scores', true);
 
 Parse.Push.send({
 where: query,
 data: {
 alert: "Pirates scored against the Cardinals! It's now 3-2."
 }
 }, {
 success: function() {
 // Push was successful
 },
 error: function(error) {
 // Handle error
 }
 }); Data stored in Installation Object can be used with Query API
  30. 30. Receiving Pushes… The JavaScript SDK does not currently support subscribing iOS and Android devices for pushes The JavaScript SDK does not currently support receiving pushes.
  31. 31. Push forward Scheduling Pushes and expiration dates Targeting by Platform and Relationships App Notification Dashboard
  32. 32. Parse Social Make your app social. Instantly https://parse.com/products/data
  33. 33. Parse User Parse.User is a subclass of Parse.Object, and has all the same features var user = new Parse.User();
 user.set("username", "Nick");
 user.set("password", "voltan123");
 user.set("email", "nick@hotmail.com");
 
 // other fields can be set just like with Parse.Object
 user.set("phone", "XXX-XX-XXXX");
 
 user.signUp(null, {
 success: function(user) {
 // Hooray! Let them use the app now.
 },
 error: function(user, error) {
 // Show the error message somewhere and let the user try again.
 }
 }); • username - required, makes sure username is unique • password - required, stores as hidden hash • email - optional, makes sure email is unique
  34. 34. User API • signUp(params,callback) - create new User • logIn(user,pass,callbacks) - authenticate User • logOut() - sign out User • save(params,callbacks) - update User fields • User.current()- get current User from localStorage • User.requestPasswordReset(email, options) http://parse.com/docs/js/symbols/Parse.User.html
  35. 35. Setup for Facebook Integration 1. Setup a Facebook App 2. Add Facebook JS SDK to your app 3. Add FB App ID to Parse App Settings Page 4. Replace FB.init() with Parse.FacebookUtils.init() https://developers.facebook.com/apps https://developers.facebook.com/docs/reference/javascript/ https://www.parse.com/apps/<your app name>/edit#authentication
  36. 36. Facebook Social Sign On allow your Parse.Users to log in or sign up through Facebook. Parse.FacebookUtils.logIn("user_likes,email", {
 success: function(user) {
 if (!user.existed()) {
 // User registered through Facebook!
 } else {
 // User signed in through Facebook!
 }
 },
 error: function(user, error) {
 // User didn’t authorize for some reason…
 }
 }); You may optionally provide a comma-delimited string that specifies what permissions your app requires from the Facebook user https://www.parse.com/docs/js_guide#fbusers-signup
  37. 37. Facebook SDK + Node… https://parse.com/questions/facebook-login-with-the-node-sdk-for-parse The Facebook JavaScript SDK does not work in Node Sign in with the Facebook Javascript SDK client side and then transfer the credentials to the server and use REST API
  38. 38. Getting more Social Security - roles and ACLs Email verification and password reset Twitter, 3rd Party Integration and Account Linking Users in Data Browser
  39. 39. Parse Analytics Track any data point in your app in real-time https://www.parse.com/products/analytics
  40. 40. Complimentary Analytics Developers using Parse Data are automatically instrumented
  41. 41. Custom Analytics Track free-form events, with a handful of string keys and values var dimensions = {
 priceRange: '1000-1500',
 customerType: 'renter',
 age: '22-25'
 };
 
 // Send the dimensions to Parse along with the 'search' event
 Parse.Analytics.track('search', dimensions); Dimensions must be string values
  42. 42. Check your Parse module version! https://parse.com/questions/updates-to-the-parse-package-innpm-appear-infrequent npm currently thinks this is the latest version root.Parse.VERSION = "js1.2.8"; Download the actual latest version manually to get Parse.Analytics Object root.Parse.VERSION = "js1.2.12"; https://www.parse.com/docs/downloads
  43. 43. Parse Hosting A powerful web presence without all the hassle. https://www.parse.com/products/hosting
  44. 44. Parse Cloud Code Add rich, custom logic to your app’s backend without servers. https://www.parse.com/products/cloud_code
  45. 45. Install Cloud Code https://parse.com/docs/cloud_code_guide curl -s https://www.parse.com/downloads/cloud_code/installer.sh | sudo /bin/bash parse new MyCloudCode Email: <enter Parse.com email> Password: <enter Parse.com password> 1:MyApp Select an App: <enter Parse App Number>
  46. 46. Cloud Code Project cloud - where you cloud code snippets live config - where your Parse app config lives public - where static files that will be hosted live Hosting a website with Parse is easy. Everything in the public directory will be hosted at your-custom-subdomain.parseapp.com.
  47. 47. Parse Deploy cd MyCloudCode parse deploy Uploading source files Finished uploading files New release is named v1
  48. 48. Cloud Functions Cloud functions can be called from any of the client SDKs, as well as through the REST API Parse.Cloud.define("averageStars", function(request, response) {
 var query = new Parse.Query("Review");
 query.equalTo("movie", request.params.movie);
 query.find({
 success: function(results) {
 var sum = 0;
 for (var i = 0; i < results.length; ++i) {
 sum += results[i].get("stars");
 }
 response.success(sum / results.length);
 },
 error: function() {
 response.error("movie lookup failed");
 }
 });
 }); Parse.Cloud.run('averageStars', {"movie":"The Matrix"}, {
 success: function(result) {
 // returns cloud function results
 },
 error: function(error) {
 // returns error from cloud code
 }
 });
  49. 49. Cloud Functions API • run(key,params,callbacks) - All • before/afterSave(class,callbacks) - All • before/afterDelete(class,callbacks) - All • useMasterKey() - Cloud Code and Node.js only • define(key,callback) - Cloud Code only • httpRequest(options) - Cloud Code only http://parse.com/docs/js/symbols/Parse.Cloud.html
  50. 50. Parse Express Server After you get Parse Hosting set up, you can add dynamic backend logic to your website by generating an Express application. parse generate express Creating directory /Users/nick/MyCloudCode/cloud/views Writing out sample file /Users/nick/MyCloudCode/cloud/app.js Writing out sample file /Users/nick/MyCloudCode/cloud/views/hello.ejs Almost done! Please add this line to the top of your main.js: require('cloud/app.js'); // These two lines are required to initialize Express in Cloud Code.
 var express = require('express');
 var app = express();
 
 // Global app configuration section
 app.set('views', 'cloud/views'); // Specify the folder to find templates
 app.set('view engine', 'ejs'); // Set the template engine
 app.use(express.bodyParser()); // Middleware for reading request body
 
 // This is an example of hooking up a request handler with a specific request
 // path and HTTP verb using the Express routing API.
 app.get('/hello', function(req, res) {
 res.render('hello', { message: 'Congrats, you just set up your app!' });
 });
 
 // Attach the Express app to Cloud Code.
 app.listen();
  51. 51. Cloud Modules Cloud Code supports breaking up JavaScript code into modules. cloud/name.js var coolNames = ['Ralph', 'Skippy', 'Chip', 'Ned', 'Scooter'];
 exports.isACoolName = function(name) {
 return coolNames.indexOf(name) !== -1;
 } cloud/main.js var name = require('cloud/name.js');
 name.isACoolName('Fred'); // returns false
 name.isACoolName('Skippy'); // returns true;
 name.coolNames; // undefined. Pre-installed Cloud Modules var Crowdflower = require('crowdflower');
 Crowdflower.initialize('myAPIKey');
  52. 52. Cloud Code limitations… Doesn’t support npm Can’t test locally Can’t debug…
  53. 53. Parse Pricing Pricing that scales with your needs.
  54. 54. Getting More Help Official Parse Tutorials https://www.parse.com/tutorials JavaScript Guide Documentation https://parse.com/docs/js_guide#javascript_guide JavaScript SDK Documentation http://parse.com/docs/js/
  55. 55. Thanks! @nickmcclay

×