小程式雲開發經驗分享
近期,小程式開放了新的能力——「小程式·雲開發」,幫助開發者快速構建微信小程式的後端服務。我作為一名微信小程式的開發者,也在第一時間嘗試了小程式雲開發,並將我自己在開發過程中的經驗分享給大家。
小程式雲開發是什麼
簡單的來說,小程式雲開發是一款 Serverless 服務,他為開發者提供了「雲函式」、「雲資料庫」和「雲檔案儲存」,並且將這些能力封裝成特定的介面,以 wx.cloud.xxx
來進行呼叫。
小程式雲開發不是什麼
首先,小程式雲開發不是 PaaS ,它和我們所熟悉的 BAE、Google App Engine 不同,所提供的雲函式並不是完整的環境,而是以一個特定的事件為單位的。嚴格來說,它所提供的雲函式
其次,小程式雲開發不是 LeanCloud 、 Bmob 之類的 BaaS 。不同於上述的兩款產品,他們提供了豐富的 API 介面,能夠實現各種各樣的功能,小程式·雲開發將介面進行深度的封裝,僅能在小程式、雲函式中通過 wx.cloud 和 wx-server-sdk 來呼叫(截止2018年8月24日)。因此,小程式雲開發 僅能應用在小程式中,無法在其他產品中應用(比如 App )
小程式雲開發適合什麼樣的場景?
所有的業務邏輯都僅僅需要在小程式端完成,無需過於複雜的管理邏輯(這是因為雲函式、雲資料庫無法在小程式以外的區域呼叫,因此無法實現強大的 Web 管理介面)
小程式雲開發的優勢
1. 微信登入邏輯簡單
小程式雲開發可以自動實現使用者登入的校驗,開發者無需再次校驗使用者身份,直接通過雲函式的 event.userInfo.openId
即可獲取到使用者資訊。直接呼叫資料庫 、檔案儲存 API 時,也會自動關聯到使用者對應的 openId ,如果使用者授權小程式獲取暱稱等資訊,這些資訊也會自動出現在小程式雲開發的管理控制檯中的使用者登入部分。不需要開發者手動上傳。
2. 免費
目前小程式雲開發提供了免費 1GB 的資料庫儲存和 免費 5 GB 的檔案儲存,這個儲存量並不是很大,但是對於一些個人開發者來說,還是綽綽有餘的,開發者可以使用這些容量來快速開發自己的小程式。
3. 簡單
小程式雲開發的呼叫非常的簡單,你只需要瞭解 JavaScript 和一些簡單的非同步的知識 (promise),就可以完成小程式雲開發的內容。
小程式開發過程中遇到的一些坑
1. 小程式雲開發新建一直表(集合)的時候 需要在表裡配置讀寫許可權,否則請求資料的時候可以查到這種表,但是沒有資料。
2. 小程式雲開發請求資料有條數限制,一次最多返回20條,請求如果放到雲函式裡,最多可以返回100條
const cloud = require('wx-server-sdk') cloud.init() const db = cloud.database() // 雲函式入口函式 //分頁查詢雲函式 exports.main = async(event, context) => { var dbName = event.dbName; //集合名稱 var filter = event.filter ? event.filter : null; var pageIndex = event.pageIndex ? event.pageIndex : 1; var pageSize = event.pageSize ? event.pageSize : 10; const countResult = await db.collection(dbName).where(filter).count() //獲取集合總記錄 const total = countResult.total; //得到總記錄數 const totalPage = Math.ceil(total / pageSize) //計算需要多少頁 var hasMore; //提示前端是否還有資料 if (pageIndex > totalPage || pageIndex == totalPage) { //沒有資料了 返回false hasMore = false } else { hasMore = true } //最後查詢資料返給前端 return db.collection(dbName).where(filter).skip((pageIndex - 1) * pageSize).limit(pageSize).get().then(res => { res.hasMore = hasMore; return res }) }
let that = this wx.cloud.callFunction({ name: 'todoList',//雲函式名稱 data: { dbName: 'todoList',//所請求的庫 pageIndex: that.data.pageIndex, //當前頁數 pageSize: that.data.pageSize//一頁返回的條數 }, success: function (res) { console.log(res.result, '[todoList][活動列表]') that.setData({ things: that.data.things.concat(res.result.data), hasMore: res.result.hasMore }) }, fail: res => { console.log(res) } })