parse, cloud code 介紹

18
快速建構MVP的利器 - Parse, Cloud Code 介紹 Wan-Ting Jheng 2015/5/19

Upload: wantingj

Post on 07-Aug-2015

427 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Parse, cloud code 介紹

快速建構MVP的利器 -Parse, Cloud Code 介紹

Wan-Ting Jheng2015/5/19

Page 2: Parse, cloud code 介紹

Parse 提供以下服務

https://www.parse.com/apps/quickstart

Page 3: Parse, cloud code 介紹

功能一覽

● Data○ 基本的 CRUD 操作

○ 關聯式資料

○ ACL (Access Control List 安全性配置)

● Push 推送通知○ iOS, Andorid, Windows, Windows Phone 8

● Analytics○ Events, 錯誤回報

● Social 使用者相關○ 註冊、登入、email 驗證、忘記密碼、user session、FB login、Role

Page 4: Parse, cloud code 介紹

功能一覽(續)

● Cloud Code○ 網頁 前/後端 程式放置平台

○ 提供各平台 SDK

● Hosting○ 提供 subdomain.parseapp.com

○ 可以自訂網域名稱 連結至 parse app

○ 後台 Log:console.log, console.error, console.warn

○ Background Job 背景排程

● Embedded○ Arduino Yun, Raspberry pi, RTOS

Page 5: Parse, cloud code 介紹

使用 javascript - 網站示範

● MapPoint○ http://map-point.parseapp.com/

○ https://github.com/wantingj/MapPoint

○ 自製類似 google map 我的地圖 服務

● 提供以下功能

○ 使用者 登入/註冊/忘記密碼

○ 使用者建立新地圖

○ 地圖上增加地點

○ 待辦:地點呈現在 map 上 (還沒有空接上 google map api …)

● Data Class (可想像成 DB table)

○ User

○ MyMap

○ MapPoint

Page 6: Parse, cloud code 介紹

Parse.Object

● Parse 會自動替每一筆資料生成以下三個欄位○ id

○ createdAt

○ updatedAt

● 上述三個欄位可以直接取○ Obj.id

○ Obj.createdAt

○ Obj.updateAt

● 其於欄位要透過 getter/setter○ Obj.get(“name”)

○ Obj.set(“name”, “value”)

Page 7: Parse, cloud code 介紹

var MyMap = Parse.Object.extend("MyMap");var myMap = new MyMap();var currentUser = Parse.User.current();

myMap.set("name", “value”);myMap.set("author", currentUser); // 用物件存關聯

var myMapACL = new Parse.ACL(currentUser);myMapACL.setPublicReadAccess(true);myMap.setACL(myMapACL);

myMap.save(null, { success: function(object){ //... }, error: function(model, error) { // error = {code: number, message: string} }});

建立類別、物件

currentUser 已登入時,為 Parse.User;未登入時,為 null

設定變數值author 對應到 Parse.User 物件

資料存取設定此處示範:只有目前登入使用者可寫,所有人可讀

存入資料庫接受 success, error callback

新增地點

Page 8: Parse, cloud code 介紹

var MapPoint = Parse.Object.extend("MapPoint")var mapPoint = new MapPoint();

mapPoint.set("name", “value”);mapPoint.set("addr", “value”);mapPoint.set("map", myMap.id); // 用 id 存關聯

var myACL = new Parse.ACL(currentUser);myACL.setPublicReadAccess(true);mapPoint.setACL(myACL);

mapPoint.save(null, { success: function(object){ // ... }, error: function(model, error) { // error = {code: number, message: string} }});

設定變數值map 對應到 MyMap 物件 id

資料存取設定此處示範:只有目前登入使用者可寫,所有人可讀

存入資料庫接受 success, error callback

新增地圖

Page 9: Parse, cloud code 介紹

// ClientParse.Cloud.run('initPage', { mapId: mapId }, { success: function(result) { // do something

// ex. gMapId = result.targetMapId; }, error: function(error) { }}

前端呼叫後端定義的 api

Page 10: Parse, cloud code 介紹

// Cloud codeParse.Cloud.define("initPage", function(request, response) { var mapId = request.params.mapId || "xjPDDwHsvK"; console.log("mapid: "+mapId); var MyMap = Parse.Object.extend("MyMap"); var query = new Parse.Query(MyMap); query.get(mapId, { success: function(queryMyMap) { // 查詢 目標地圖 成功

queryMyMap.get("author").fetch({ success: function(user) { // 撈作者成功

var targetMapAuthorName = ""; if(user){ targetMapAuthorName = user.get("username");

response.success({ targetMapId: mapId, targetMapName: queryMyMap.get("name"), targetMapAuthorName: targetMapAuthorName, editable: queryMyMap.getACL().getWriteAccess(currentUser.id) }); } } });},error: function(error) { response.error("查詢失敗; ["+error.code+"] "+error.message);}});}

在 server 端,定義 api透過 request.params 取得輸入值

log 內容會記錄在 parse app > 上方ccore > 左側 Logs > info

mapId 是 MyMap id 可由 get 直接取得物件

Parse.Query 其它方法,舉例如下 equalTo, notEqualTo, greaterThan, greaterThanOrEqualTo limit, skip ascending, descending find, first

欲回傳前端的內容以 JSON 包裝塞進 response 的 success/error

ACL 要透過 get/setACL 才能取得

由於 javascript 的 unblock 特性多句查詢需要層層嵌套

Page 11: Parse, cloud code 介紹

// Cloud codeParse.Cloud.beforeSave("MapPoint", function(request, response) { if(request.object.get("addr").length < 5){ response.error("地址太短"); } else { response.success(); }});

Parse.Cloud.beforeSave(Parse.User, function(request, response) { if (request.object.get("username").length < 4) { response.error("帳號太短,至少四個字元 "); } else { response.success(); }});

第一個參數,要應用在自訂類別的話填入類別名稱字串要應用在系統類別,如 Parse.User直接傳遞該類別

[before/after] x [save/delete]交叉組成以下四個方法

beforeSavebeforeDeleteafterSaveafterDelete

可應用在許多功能上,例如

beforeSave 伺服器端驗證

截字處理 …beforeDelete 地圖內還有地點資料,不允許刪除

afterSave 發 pushafterDelete 刪除地圖後也一併刪除相關的地點

Page 12: Parse, cloud code 介紹

// 登入

Parse.User.logIn("username", "password", { success: function(user) { /* ... */ }, error: function(user, error) { /* ... */ }});

// 註冊

var user = new Parse.User();user.set("username", name);user.set("email", email);user.set("password", pw);

user.signUp(null, { success: function(user) { /* ... */ }, error: function(user, error) { /* ... */ }});

// 忘記密碼

Parse.User.requestPasswordReset(email, { success: function() { /* ... */ }, error: function(error) { /* ... */ }});

// 登出

Parse.User.logOut();

登入/註冊成功後,會自動快取不需要每次開頁面都要做 login可透過 Parse.User.current() 來判斷

Parse 檢查不允許 帳號、email 重覆

Page 13: Parse, cloud code 介紹

忘記密碼

● 發信至註冊信箱

● 點擊信箱裡提供的連結,見到如下畫面,重設密碼

● 連結執行過就失效

● Parse app 可以設定信件內容樣版

Page 14: Parse, cloud code 介紹

var Message = Parse.Object.extend("Message");var groupMessage = new Message();var groupACL = new Parse.ACL();

// userList 為 Parse.User 物件組合成的 arrayfor (var i = 0; i < userList.length; i++) { groupACL.setReadAccess(userList[i], true); groupACL.setWriteAccess(userList[i], true);}

groupMessage.setACL(groupACL);groupMessage.save();

此為官網程式範例示範一則訊息允許多個協作者共同擁有讀寫權限

ACL 協作權限示範

Page 15: Parse, cloud code 介紹

建置網站 步驟

● 在 parse 上註冊帳號

● 如果是透過OAuth註冊帳號,需手動設定密碼

○ 右上角 username > Account > click “Update” button > 填入密碼

● 到 parse app (https://www.parse.com/apps) 新增APP● 在本機要建立工作目錄的地方,執行以下指令,藍字表示依自身情況而變動

$ parse new MyCloudCode Email: [email protected]:1:MyApp2:MyOtherAppSelect an App: 1 $ cd MyCloudCode

以上會自動產生工作目錄,有三個資料夾: config, public, cloud

分別存放:設定檔、前端程式、伺服端器程式

Page 16: Parse, cloud code 介紹

建置網站 步驟(續)

● parse app > target app > 上方 Setting > 左側 Keys,取得 key

填到程式裡對應的地方 (根據要開發平台而不同)○ ex. 開發 javascript 網站 Parse.initialize("Application ID", "Javascript Key");

● parse app > target app > 上方 Setting > 左側 Hosting > 右側 Web Hosting

填入想要的 ParseApp subdomain

● 前後端程式寫好,放進 public, cloud 資料夾

● 執行 $ parse deploy● 完成,到剛指定的網址上觀看結果 ex. your-subdomain.parseapp.com

Page 17: Parse, cloud code 介紹

結語

讓開發新產品

更快速、容易

使我們得以專注在 產品功能

精進介面設計

以提供更加豐富的產品體驗

缺點是 server 端 debug 有點困難 … XD

Page 18: Parse, cloud code 介紹

ReferenceParse 官網 javascript doc - Parse JavaScript SDK & Cloud Code Reference

https://www.parse.com/docs/js/api/symbols/Parse.html

Parse 官網 快速開始 教學

https://www.parse.com/apps/quickstart

Parse 官網 javascript guide

https://www.parse.com/docs/js/guide

Parse 官網 javascript guide 中文翻譯版

https://www.parse.com/docs/tw/js/guide

Node.js and Parse

http://www.slideshare.net/NicholasMcClay/nodejs-and-parse