什么是云開(kāi)發(fā)?
云開(kāi)發(fā)是可以幫助我們快速成為全棧的一種后端云服務(wù),采用的是Serverless的架構(gòu)。開(kāi)發(fā)者無(wú)須搭建服務(wù)器,可直接使用其中的云數(shù)據(jù)庫(kù)、云存儲(chǔ)、云函數(shù)等云服務(wù)基礎(chǔ)功能。
那么這個(gè)時(shí)候你可能會(huì)想,這和現(xiàn)在的傳統(tǒng)開(kāi)發(fā)模式有什么區(qū)別呢?下面通過(guò)現(xiàn)實(shí)生活中蓋房子的過(guò)程來(lái)了解傳統(tǒng)開(kāi)發(fā)模式與云開(kāi)發(fā)模式的區(qū)別。
如果傳統(tǒng)方式來(lái)蓋房子需要6步:
1)將房子的地基打好,設(shè)計(jì)整理結(jié)構(gòu)。(后端云服務(wù)基礎(chǔ)架構(gòu))
2)打地梁,地梁也是決定房子是否穩(wěn)固的關(guān)鍵。(搭建云數(shù)據(jù)庫(kù))
3)主體的砌筑,將房子的基本結(jié)構(gòu)蓋好。(搭建云存儲(chǔ))
4)在步屋內(nèi)填上土,砸夯,將地面砸實(shí)。(搭建云函數(shù))
5)在屋頂鋪上水泥,封實(shí)。(提供靜態(tài)托管和擴(kuò)展能力)
6)裝修成自己喜歡的風(fēng)格。(編寫(xiě)業(yè)務(wù)需求邏輯代碼)
而云開(kāi)發(fā)模式只有一步,即裝修成自己喜歡的風(fēng)格??梢钥吹綀D1-1展示的是傳統(tǒng)開(kāi)發(fā)需要管理的基礎(chǔ)資源與云開(kāi)發(fā)需要管理的基礎(chǔ)資源的對(duì)比,可以幫助我們更清晰的了解兩者之間的差距。
圖1-1 傳統(tǒng)開(kāi)發(fā)需要管理的基礎(chǔ)資源VS云開(kāi)發(fā)需要管理的基礎(chǔ)資源
就這一步即可。云開(kāi)發(fā)提供完整的后端云服務(wù),提供數(shù)據(jù)庫(kù)、存儲(chǔ)、函數(shù)、靜態(tài)托管等基礎(chǔ)能力,以及擴(kuò)展能力,無(wú)須管理基礎(chǔ)架構(gòu)。相比較傳統(tǒng)的開(kāi)發(fā)模式,云開(kāi)發(fā)至少可節(jié)省50%的人力成本、交付效率提升70%。
云開(kāi)發(fā)模式調(diào)整
在此之前我們需要把原來(lái)碼仔備忘錄項(xiàng)目改成云開(kāi)發(fā)項(xiàng)目,所以需要先把項(xiàng)目從項(xiàng)目管理中先刪除。(如果是直接新建的云開(kāi)發(fā)項(xiàng)目可以忽略這一步)
首先,先進(jìn)入小程序項(xiàng)目管理頁(yè)面:
然后點(diǎn)擊右上角「管理」按鈕進(jìn)入該頁(yè)面的管理狀態(tài)。
然后選中你之前的單機(jī)版本勾選進(jìn)行刪除即可。
接下來(lái)我們?cè)趯?dǎo)入項(xiàng)目界面對(duì)云開(kāi)發(fā)進(jìn)行勾選即可。
這個(gè)時(shí)候進(jìn)入我們會(huì)發(fā)現(xiàn)小程序開(kāi)發(fā)工具自動(dòng)給我們生成了一套云開(kāi)發(fā)Demo,我們先直接處理掉。
意思就是找不到小程序云開(kāi)Demo代碼的里面的一些模塊,這個(gè)不用理會(huì)直接先把Demo代碼全部刪除。
刪除后我們就可以看到正常的頁(yè)面渲染了。
回到正常狀態(tài)下,我們接下來(lái)要改造的就是數(shù)據(jù)操作這塊的業(yè)務(wù)。
數(shù)據(jù)緩存改造云開(kāi)發(fā)
在改造之前我們先要梳理思路。
- 首先我們先通過(guò)之前學(xué)習(xí)過(guò)抽象方法。
- 把所有和數(shù)據(jù)操作相關(guān)的方法都抽取到一個(gè)js類(lèi)里面,這樣便于維護(hù)。
- 將所有的方法替換成云數(shù)據(jù)庫(kù)的操作函數(shù)。
抽象數(shù)據(jù)操作API
我們?cè)诟夸浵旅嫘略?api 的文件夾,然后在其文件夾下面新增一個(gè) memo.js 用于存放所有備忘錄的操作API。
梳理下有哪些方法:
- 獲取備忘錄列表
- 獲取備忘錄詳情
- 新增備忘錄信息
- 刪除備忘錄信息
- 修改備忘錄信息
先給相關(guān)的方法取好函數(shù)名稱(chēng),然后進(jìn)行導(dǎo)出聲明。
memo.js 完整代碼
首先我們來(lái)實(shí)現(xiàn)獲取備忘錄列表,在列表頁(yè)面 onShow 函數(shù)中會(huì)被調(diào)用。
在這個(gè)時(shí)候setData是頁(yè)面操作函數(shù),所以我們要抽象的部分是:
接下來(lái)我們就把這段代碼放在memo.js里面去。
memo.js 關(guān)于 getMemoList 的代碼片段
然后替換成列表頁(yè)面的調(diào)用,先引入memo的獲取 getMemoList 函數(shù)。
list.js 頭部引入代碼片段
引入后在 onShow 函數(shù)中使用
在 onShow 所有代碼片段
采取同樣的方式,我們可以把之前的獲取詳情、刪除、修改都抽象到 memo.js 中:
memo.js 所有代碼
在相應(yīng)業(yè)務(wù)場(chǎng)景進(jìn)行調(diào)用,調(diào)用之前都要先引入方法才行。由于引入代碼相對(duì)重復(fù),下面就不貼引入代碼了,只貼使用代碼。
刪除代碼方法調(diào)用:
list.js 中 del 函數(shù)所有代碼
查看備忘錄詳情調(diào)用:
edit.js 中 onLoad 函數(shù)所有代碼
新增和刪除方法調(diào)用:
edit.js 中 save 函數(shù)中的關(guān)于保存和修改的代碼片段
到這里我們就完成了第一步,先抽取數(shù)據(jù)操作對(duì)象,然后我們要進(jìn)行云數(shù)據(jù)庫(kù)到操作了。
操作云數(shù)據(jù)庫(kù)
初始化數(shù)據(jù)庫(kù)
首先我們先進(jìn)入云開(kāi)發(fā)控制臺(tái)。
然后選中「數(shù)據(jù)庫(kù)」。
云開(kāi)發(fā)提供了一個(gè) JSON 數(shù)據(jù)庫(kù),顧名思義,數(shù)據(jù)庫(kù)中的每條記錄都是一個(gè) JSON 格式的對(duì)象。一個(gè)數(shù)據(jù)庫(kù)可以有多個(gè)集合(相當(dāng)于關(guān)系型數(shù)據(jù)中的表),集合可看做一個(gè) JSON 數(shù)組,數(shù)組中的每個(gè)對(duì)象就是一條記錄,記錄的格式是 JSON 對(duì)象。
我們會(huì)發(fā)現(xiàn)沒(méi)有可用的集合,再次新建一個(gè)集合 memo,用于存放備忘錄數(shù)據(jù)。
新增一條數(shù)據(jù)
我們先手動(dòng)新增一條測(cè)試數(shù)據(jù)看看,點(diǎn)擊「添加記錄」。
我們用以上測(cè)試數(shù)據(jù)添加進(jìn)去
除此之外我們可以看到可以添加多種不同類(lèi)型的數(shù)據(jù),云開(kāi)發(fā)數(shù)據(jù)庫(kù)提供以下幾種數(shù)據(jù)類(lèi)型:
- String:字符串
- Number:數(shù)字
- Object:對(duì)象
- Array:數(shù)組
- Bool:布爾值
- Date:時(shí)間
- Geo:多種地理位置類(lèi)型
- Null
我們先默認(rèn)都用 string 類(lèi)型的數(shù)據(jù),新增完成之后就可以做memo集合中看到一條數(shù)據(jù)了。
數(shù)據(jù)表已經(jīng)有數(shù)據(jù)了,那么我們?cè)趺传@???
獲取數(shù)據(jù)庫(kù)數(shù)據(jù)
我們回到小程序編輯臺(tái),對(duì)我們的獲取數(shù)據(jù)方法進(jìn)行下改造。
這個(gè)是獲取本地的數(shù)據(jù)方法,下面是獲取數(shù)據(jù)庫(kù)方法
當(dāng)我們?nèi)チ斜眄?yè)面進(jìn)行調(diào)用的時(shí)候發(fā)現(xiàn)報(bào)錯(cuò):
原來(lái)是在此之前還需要進(jìn)行云API的初始化。
那么現(xiàn)在問(wèn)題來(lái)了,我們后續(xù)會(huì)遇到大量的調(diào)用云API,那么都需要一開(kāi)始初始化,并且這個(gè)初始化只需要一次,這個(gè)時(shí)候初始化我們應(yīng)該在哪里進(jìn)行調(diào)用呢?
當(dāng)一個(gè)函數(shù)應(yīng)用一開(kāi)始就需要調(diào)用的時(shí)候并且只需要調(diào)用一次,我們可以在app.js的 onLaunch 生命周期中調(diào)用。
app.js 的 onLaunch 函數(shù)代碼片段
接下來(lái)在看調(diào)用看看,在這里告訴大家一個(gè)調(diào)試技巧,使用調(diào)試器中的Network面板,然后選中Cloud標(biāo)簽進(jìn)行過(guò)濾,在這里我們就可以剛才調(diào)用API請(qǐng)求。
先看看請(qǐng)求狀態(tài),從狀態(tài)來(lái)看是成功的請(qǐng)求。
然后我們?cè)賮?lái)看看返回的數(shù)據(jù):
明明有一條數(shù)據(jù),為什么獲取不到呢?
因?yàn)樵崎_(kāi)發(fā)數(shù)據(jù)庫(kù)集合讀取權(quán)限問(wèn)題。默認(rèn)我們新建的集合讀取權(quán)限是僅創(chuàng)建則可以讀寫(xiě),第一條測(cè)試數(shù)據(jù)是我們手動(dòng)錄入的,所以沒(méi)有創(chuàng)建者,默認(rèn)權(quán)限于是就讀取不到。
我們可以來(lái)到云開(kāi)發(fā)控制面板,然后找到 數(shù)據(jù)庫(kù)=> 數(shù)據(jù)權(quán)限。
我們把權(quán)限從「僅創(chuàng)建者可讀寫(xiě)」修改為「所有用戶可讀,僅創(chuàng)建者可讀寫(xiě)」試試看。修改完成之后再次調(diào)用獲取方法,看到返回結(jié)果中出現(xiàn)了這條測(cè)試數(shù)據(jù)。
雖然數(shù)據(jù)出來(lái)了,但是我們會(huì)發(fā)現(xiàn)還有一個(gè)錯(cuò)誤日志。
具體代碼塊:
原因:在沒(méi)有使用云API之前我們使用的緩存操作API是同步操作返回了具體數(shù)據(jù),而修改后的獲取數(shù)據(jù)方法是異步函數(shù),沒(méi)有給到數(shù)據(jù)到列表頁(yè)面進(jìn)行使用。最終導(dǎo)致list數(shù)據(jù)對(duì)象為空,list的length自然就出現(xiàn)了undefined的錯(cuò)誤提示。
從數(shù)據(jù)庫(kù)獲取數(shù)據(jù)除了可以用以上的實(shí)現(xiàn) success 方法,同樣還支持可以用 Promise 風(fēng)格調(diào)用:
可以簡(jiǎn)單理解成將包裹的回調(diào)函數(shù)調(diào)用方式改成了鏈?zhǔn)秸{(diào)用的回調(diào)函數(shù)
基于 Promise 風(fēng)格調(diào)用,我們可以將函數(shù)拆解成兩部分。接下來(lái)再改造一下,傳遞數(shù)據(jù)的部分代碼:
1.將查詢代碼在 getMemoList 完成
2.將查詢結(jié)果在列表頁(yè)面進(jìn)行列表渲染
這樣我們就成功的將數(shù)據(jù)庫(kù)的數(shù)據(jù)顯示出來(lái)了
接下來(lái),我們就來(lái)把所有方法進(jìn)行云API的實(shí)現(xiàn)。
查看數(shù)據(jù)詳情
在這里我們就不能用index下標(biāo)來(lái),通常與后端交互我們都會(huì)采用ID來(lái)進(jìn)行查詢,每條數(shù)據(jù)都會(huì)生成一個(gè)ID字段,字段名稱(chēng)為_(kāi)id。
獲取id進(jìn)行頁(yè)面?zhèn)鬟f
查詢方法改造,由于通過(guò)id查詢是非常常用的方法,所以云API直接有個(gè)doc方法傳入id即可查詢:
memo.js 中 getMemoInfo 函數(shù)代碼
查詢方法調(diào)用:
edit.js 中 onLoad 函數(shù)代碼
新增備忘錄數(shù)據(jù)
新增方法改造:
memo.js 中 addMemoInfo 函數(shù)
調(diào)用方法:
edit.js 中 save 函數(shù)新增邏輯代碼片段
新增成功后會(huì)返回新增數(shù)據(jù)的id信息。
然后在數(shù)據(jù)庫(kù)當(dāng)中就可以看到新增的數(shù)據(jù)了。
然后在看下列表返回的數(shù)據(jù),只有自己新增的那條數(shù)據(jù)了。
修改備忘錄數(shù)據(jù)
修改方法改造:
memo.js 中 updateMemoInfo 函數(shù)。
之前修改的邏輯是采用的刪除之后再新增做的“假”修改,這次我們直接采用修改方法。
edit.js 中 save 函數(shù)修改邏輯代碼片段
返回結(jié)果中的 updated 是代表修改成功數(shù)據(jù)的數(shù)量
刪除備忘錄數(shù)據(jù)
刪除方法改造:
memo.js 中 deleteMemoInfo 函數(shù)
調(diào)用方法:
list.js 中 del 函數(shù)
在這里要注意的是刪除之后還需要調(diào)用查詢所有數(shù)據(jù)方法對(duì)列表更新。
返回值 removed 為刪除數(shù)量。
總結(jié)
在本小節(jié)我們使用云API在小程序端操作了云數(shù)據(jù)庫(kù),學(xué)習(xí)了以下函數(shù):
- 使用 get() 進(jìn)行了數(shù)據(jù)庫(kù)的查詢
- 使用 add() 進(jìn)行了數(shù)據(jù)添加
- 使用 update() 進(jìn)行了數(shù)據(jù)修改
- 使用 remove() 進(jìn)行了數(shù)據(jù)刪除
在這里我們就已經(jīng)完成了使用云數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)備忘錄數(shù)據(jù)。