2015年12月29日 星期二

Parse Cloud anyimage程式架構(二)--- 程式碼講解

app.js,是所有程式的入口,先在前先宣告所有require的部分,第一個是express,因為express 中是用 ejs 作為 view template engine,第二個是expressLayout,是require等等會介紹的express-layout.js的部分,第三個跟第四是parse的library,分別用來存local端的cookie和當路徑名稱是目錄時,重新導向至尾端 “/“。

接下來宣告的app就是我們在這個程式裡面會不斷不斷使用的變數,用var app=express()來使用express裡面所有的method。



第28行的部分是parse宣告物件的方法,宣告image這個物件是extend image這個class的。
而第33行開始是query的方法,
parse query的方法有四個步驟,第一是先宣告是哪個class的query,第二是設定條件,在parse的document裡面有詳細的api介紹,可以到官網去看,有遞增或是遞減或是相等之類之類的條件,第三是限制數目,要取前幾個,第四就是開始找了,可以用query.first或是query.find,query.first就是只找第一筆,find是全部,所以如果要一筆一筆讀的話再find裡面還要加一個迴圈。

上面代碼使用render的方法,對網頁模板進行渲染,render方法的參數就是模板的文件名,放在views的裡面。


express-layout.js
這個是直接用 express-ejs-layouts npm module:
 https://npmjs.org/package/express-ejs-layouts
跟cloud code內容沒有太大關係反正就是網頁的layout,這邊就不多加撰述

image.js
會reqire user是因為這個js裡面可以判斷什麼user需要顯示什麼,從第三行開始上一篇有提過,是宣告object的方法,第12行開始進入正式express內容
第19行開始,是建立新的image,我們這個網站就是拿來上傳照片的啦,所以只要有req.body.file,我們就宣告image是一個extend parse class "Image"的object,並且將上傳的title和file set到parse class中的欄位。
第28行開始是設定權限,設定目前使用者的權限可以read或write,是使用parse的parse.current()可以直接抓到目前使用者。

接下來是儲存的部分,欄位都設定好之後需要讓object儲存,使用object.save(),這裏因為宣告image是object所以是image.save()。

那什麼是image.save()後面的.then()呢?好我們等等最後解釋。
最後使用的是app.get,第一個參數是顯示的頁面,在view template中的latest,把剛剛新增好的image重新query一次,可以顯示出最新的相片們。

重要的來了,parse最重要的精華,叫做promise!
若使用 Promise,程式碼將比您使用回呼的巢狀化程式碼還要簡潔。


每個 Promise 都有一個命名為 then 的方法。此方法會取得一對回呼。如果 Promise 已解析,就會呼叫第一個回呼;如果 Promise 遭拒絕,則會呼叫第二個回呼。

Promise 有一點神奇之處在於能讓您不必巢狀化處理即可串連它們。如果某個 Promise 的回呼傳回新的 Promise,則在解析第二個 Promise 之前,不會解析第一個 Promise。這樣做能讓您執行多個動作,而不會在使用回呼時產生金字塔型程式碼。
這種同步的方法在處理資料的過程會大量的使用。

main.js
主要功能是拿來儲存照片,resize-image-key.js會將上傳的照片分成許多不同大小,main.js存入table中,顯示的是正方形的,原始的可能是多邊型之類的,這裡提供一個儲存前檢查的方法,使用的是beforesave的function,在官網的tutorial部分有提到,這個可以在save()之前呼叫,可以先做檢查或是先對資料做一些處理,像這邊就是先去get原來的大小,等到get之後(有promise做確認),再去看是不是新的,如果是新的就把瀏覽次數設定為0,然後存入table中,所以table裡面有一個欄位是view也就是瀏覽次數,如果不是新的的話就不用設

因為程式的入口是app.js所以先require他,

接下來是對於每個需儲存欄位的檢查,比如說欄位的位元限制啊、欄位不能是空的啊之類之類的,最後由41行開始回傳,也是利用promise。

































在做了這麼多工作之後,接下來要update到metadata的部分, 使用cloud function中的define,第一個參數是funcition的名字,然後每次都增加一次瀏覽次數,最後儲存之後再response,記得!一定要回傳成功或是失敗,不然沒辦法跑,尤其是promise也會很常忘記成功失敗的部分。


require-user.js,單純設定條件,如果有登入就可以繼續,如果沒有就必須傳遞給使用者需要登入的訊息


resize-image-key.js
這個主要是用來對照片做各個不同大小的切割,利用設定他們的height跟width,沒什麼特別的要解釋

user.js
這裏提供了登入跟註冊的endpoint,利用app.get還有.post,get的部分就是去擷取輸入的資料,post的部分就是傳遞給下一個頁面需要的資料,所以任何需要穿地資料的頁面都要用到get跟post。
還有需要提到的是parse有自己的user library,可以使用的有user.set、login之類的,只要先宣告var user = new Parse.User();就可以使用



像第40行的res.render第一個參數就是要render的ejs,後面是傳進去的參數,可以讓ejs接收並且顯示出來,這就是為什麼js是model,ejs是view。

剩下的ejs的部分因為跟原生的html很像,只是利用一些script去抓去資料庫的資料還有接收參數,蠻容易懂得,就不多加撰述,因為ejs是屬於被動的東西,只有被render的時候才會出現。



沒有留言:

張貼留言