主題
結(jié)合官方文檔点楼,介紹微信云開發(fā)的使用宠纯,并補充了文檔中沒有講清楚的部分
特別說明
CocosCreator微信小游戲開發(fā)系列文章对雪,是我在逐步開發(fā)過程中怜庸,基于官方文檔之上当犯,記錄一些重點內(nèi)容,以及對官方文檔中有些知識點的補充和分析割疾。
正文
1. 在微信開發(fā)者工具中創(chuàng)建并配置云開發(fā)項目
先在微信開發(fā)者工具中創(chuàng)建一個小游戲項目嚎卫,如下圖:
圖中的AppID,如果還沒有注冊的,需要先到微信公眾平臺注冊一個小程序拓诸,因為使用測試號生成的AppID侵佃,無法看到圖中的“后端服務->小程序-云開發(fā)”選項。
項目創(chuàng)建好并打開項目后如上圖所示奠支,看到 cloudfunction 目錄提示“未選擇環(huán)境”馋辈,是因為你還沒開通云開發(fā),點擊上圖紅色框中的“云開發(fā)”倍谜,會彈出“云開發(fā)控制臺”迈螟,直接選擇“開通”。如果開通了還是沒有綁定環(huán)境尔崔,可以關(guān)閉再重新打開項目答毫。
開通后,會彈出協(xié)議彈窗(有興趣的可以點進去看看)季春,直接“同意”洗搂,需要填寫創(chuàng)建新環(huán)境需要的名稱和付費套餐,付費套餐都有免費額度载弄,未超過免費額度不收費耘拇,所以我直接選擇的個人預付費,套餐計費詳情可以點這里宇攻,如下圖:
根據(jù)個人情況選擇套餐就好了惫叛,提交訂單,然后耐心等待環(huán)境初始化尺碰。
云開發(fā)控制臺是管理云開發(fā)資源的地方挣棕,控制臺提供以下能力:
- 運營分析:查看云開發(fā)監(jiān)控、配額使用量亲桥、用戶訪問情況
- 數(shù)據(jù)庫:管理數(shù)據(jù)庫,可查看固耘、增加曹步、更新适室、查找、刪除數(shù)據(jù)、管理索引研乒、管理數(shù)據(jù)庫訪問權(quán)限等
- 存儲管理:查看和管理存儲空間
- 云函數(shù):查看云函數(shù)列表、配置欧宜、日志
2. 云函數(shù)介紹
云開發(fā)環(huán)境創(chuàng)建好以后屹逛,可以先關(guān)掉控制臺了,回到游戲項目里環(huán)境會自動綁定環(huán)境好(如果還是沒有綁定環(huán)境拗馒,可以關(guān)閉再重新打開項目)路星,環(huán)境綁定好后,就可以開始嘗試編寫云函數(shù)了诱桂。
云函數(shù)即在云端(服務器端)運行的函數(shù)洋丐。開發(fā)者無需購買呈昔、搭建服務器,只需編寫函數(shù)代碼并部署到云端即可在小程序端調(diào)用友绝。云函數(shù)之間也可互相調(diào)用堤尾,叫做云調(diào)用。
云函數(shù)的寫法與一個在本地定義的JavaScript
方法無異迁客,代碼運行在云端Node.js
中郭宝。當云函數(shù)被小程序端調(diào)用時,定義的代碼會被放在Node.js
運行環(huán)境中執(zhí)行掷漱。
我們可以像在Node.js
環(huán)境中使用JavaScript
一樣剩蟀,在云函數(shù)中進行網(wǎng)絡請求等操作,還可以通過云函數(shù)后端 SDK 搭配使用多種服務切威,比如使用云函數(shù) SDK 中提供的數(shù)據(jù)庫和存儲 API 進行數(shù)據(jù)庫和存儲的操作育特,這部分可參考數(shù)據(jù)庫和存儲后端 API 文檔。
云函數(shù)的獨特優(yōu)勢在于與微信登錄鑒權(quán)的無縫整合先朦。當小程序端調(diào)用云函數(shù)時缰冤,云函數(shù)的傳入?yún)?shù)中會被注入小程序端用戶的 openid,開發(fā)者可以直接使用該 openid喳魏,有了openid相當于拿到了用戶的唯一uid棉浸,其他的數(shù)據(jù)都通過uid來關(guān)聯(lián)。
其實在項目創(chuàng)建時刺彩,開發(fā)者工具已經(jīng)自動為我們準備好了兩個云函數(shù)模版login和uploadScore迷郑,分別介紹獲取openid和小程序上傳數(shù)據(jù)到云數(shù)據(jù)庫中,我們可以結(jié)合官方文檔來掌握他們的寫法创倔。
3. 云函數(shù)創(chuàng)建和編寫
接下來嗡害,在項目根目錄找到project.config.json
文件,搜索cloudfunctionRoot
字段畦攘,如果沒有新增cloudfunctionRoot
字段霸妹,它的作用是指定本地已存在的目錄作為云開發(fā)的本地根目錄,示例:
{
"cloudfunctionRoot": "cloudfunction/"
}
選中 cloudfunction 目錄知押,鼠標右鍵喚出菜單叹螟,包含以下選項:
- 查看當前環(huán)境
- 新建 Node.js 云函數(shù)
- 同步云函數(shù)列表
- 開啟云函數(shù)本地調(diào)試
1. 創(chuàng)建一個云函數(shù)
選擇“新建Node.js云函數(shù)”,然后輸入云函數(shù)的名稱台盯,比如query罢绽,確定后本地會創(chuàng)建如下圖的“目錄結(jié)構(gòu)和文件”,同時會自動上傳云函數(shù)到線上環(huán)境中:
cloudfunction
|-- query (以云函數(shù)名字命名的目錄静盅,存放該云函數(shù)的所有代碼)
|-- config.json (配置文件)
|-- index.js (云函數(shù)入口文件)
|-- package.json (npm包定義文件)
|-- ... (自定義文件)
config.json
:目前知道的可配置內(nèi)容是定時觸發(fā)器和云調(diào)用權(quán)限(可以點擊參考對應的官方文檔)良价。
index.js
:云函數(shù)被調(diào)用時實際執(zhí)行的入口函數(shù)是index.js
中導出的main
方法
package.json
:默認定義了最新wx-server-sdk
依賴,將云函數(shù)用到的依賴放到文件中,部署和本地調(diào)試時工具會執(zhí)行npm install
來看下index.js
的代碼:
// 云函數(shù)模板
const cloud = require('wx-server-sdk')
// 初始化 cloud
cloud.init({
// API 調(diào)用都保持和云函數(shù)當前所在環(huán)境一致
env: cloud.DYNAMIC_CURRENT_ENV
})
/**
* exports.main即為云函數(shù)執(zhí)行的入口方法
* 這個示例將經(jīng)自動鑒權(quán)過的小程序用戶 openid 返回給小程序端
* event 參數(shù)包含小程序端調(diào)用傳入的 data
*/
exports.main = async (event, context) => {
// console.log 的內(nèi)容可以在云開發(fā)云函數(shù)調(diào)用日志查看
console.log(event)
// 獲取 WX Context (微信調(diào)用上下文)棚壁,包括 OPENID杯矩、APPID等信息
const wxContext = cloud.getWXContext()
// 可執(zhí)行其他自定義邏輯
...
return {
event,
openid: wxContext.OPENID,
appid: wxContext.APPID,
env: wxContext.ENV,
}
}
一個云函數(shù),可以類比成服務器的一個api接口袖外,但是在自己的服務器api接口中史隆,我們一般需要做token和驗簽等身份校驗的工作,而在云函數(shù)中wx-server-sdk
幫我們做了這些工作曼验,通過wxContext.OPENID
能直接拿到唯一標識openid泌射,相當于api接口中的用戶uid,我們只需要專注于業(yè)務邏輯的實現(xiàn)鬓照。
再來看云函數(shù)的調(diào)用方式:
//Promise風格的調(diào)用
wx.cloud.callFunction({
// 云函數(shù)名稱
name: 'query',
// 傳給云函數(shù)的參數(shù)
data: {
name: 'cloud'
},
})
.then(res => {
console.log(res.result)
})
.catch(console.error)
為什么是這么調(diào)用呢熔酷?
來看exports.main
方法,函數(shù)聲明用了async
關(guān)鍵字豺裆,方法體執(zhí)行完后拒秘,會返回Promise對象,那async
關(guān)鍵字有什么作用呢臭猜?
async
和await
關(guān)鍵字在JavaScript中代表函數(shù)的異步執(zhí)行和同步執(zhí)行躺酒。
什么是async
異步執(zhí)行呢,舉個例子蔑歌,你在火車站窗口排隊買票羹应,售票員給你買票時,發(fā)現(xiàn)你沒帶身份證次屠,所以售票員不能給你買票园匹,要你帶著身份證來才給你買。售票員不會因為你沒帶身份證劫灶,而一直等著你拿到身份證裸违,不給其他人買票;實際上你怎么去拿身份證浑此,中間花了多久累颂,售票員不會在意,他只要你拿著身份證就可以找他買票凛俱。
這個例子中“去拿身份證”的過程,就是一個async
異步執(zhí)行過程料饥,它不會影響售票員給其他人買票蒲犬,等你拿到身份證了,就可以找售票員買票岸啡。
我們繼續(xù)延伸這個例子:在售票員給你買票時原叮,必須要等付完錢,才能出票。你打開手機掃碼付錢的過程奋隶,是售票員必須要等待的擂送,這個等待過程就是await
同步執(zhí)行。
async
修飾的函數(shù)必須要等到方法體中所有await
聲明的函數(shù)執(zhí)行完后唯欣,async函數(shù)才會得到一個resolve狀態(tài)的Promise對象嘹吨。
而如果在執(zhí)行async
異步函數(shù)的過程中,一旦異步函數(shù)出現(xiàn)錯誤境氢,整個async函數(shù)就會立即拋出錯誤蟀拷,但是如果在async函數(shù)中對異步函數(shù)通過try/catch
封裝,并在catch方法體中返回Promise.reject()
,這樣async函數(shù)將得到一個reject狀態(tài)的Promise萍聊,有效的避免因為異步函數(shù)導致整個async函數(shù)的終止,這就推導出了如下的調(diào)用鏈:
wx.cloud.callFunction(...).then(res => {...}).catch(...)
then()
是云函數(shù)執(zhí)行完成的回調(diào)結(jié)果问芬,catch()
是云函數(shù)異常的回調(diào)結(jié)果。
注意: 這里只是簡單介紹了async
和await
關(guān)鍵字作用寿桨,要想深入了解它們的原理和進階用法此衅,可以關(guān)注我的公眾號「掉隊程序員」,我會在公眾號持續(xù)更新這方面內(nèi)容亭螟。
2. 同步云函數(shù)列表
在右鍵菜單中挡鞍,選擇“同步云函數(shù)列表”,可以將線上環(huán)境中的云函數(shù)列表同步到本地媒佣,開發(fā)者工具會根據(jù)云函數(shù)的名字匕累,在本地中創(chuàng)建出對應的云函數(shù)目錄。
而在一個云函數(shù)目錄上右鍵默伍,在菜單中選擇"下載"欢嘿,云函數(shù)代碼會被下載到指定目錄(指定到同名的云函數(shù)目錄下)。
注意: 如果本地已經(jīng)存在該云函數(shù)也糊,則會覆蓋本地的代碼炼蹦。
3. 開啟云函數(shù)本地調(diào)試
在微信開發(fā)工具中提供了一套與線上環(huán)境一致的Node.js
云函數(shù)運行環(huán)境,讓開發(fā)者可以在本地對云函數(shù)進行調(diào)試狸剃,等同于預發(fā)布測試環(huán)境掐隐,在本地調(diào)試完畢以后在將云函數(shù)上傳部署。
具體的調(diào)試過程钞馁,官方文檔講的很清楚虑省,可以看這里。
4. 云函數(shù)上傳部署
云函數(shù)上傳部署分為 所有文件 和 云端安裝依賴(不上傳node_modules)
如果想在云函數(shù)中使用自定義的配置文件僧凰,比如:配置風控開關(guān)探颈,怎么辦呢?
在云函數(shù)執(zhí)行過程中训措,通過__dirname
可獲取當前云函數(shù)的根目錄伪节,而和云函數(shù)打包上傳的文件(兩種上傳部署都會將除node_modules目錄下的其他文件一起上傳)光羞,可以通過__dirname
加相對路徑引用獲取。
這兩種上傳方式的區(qū)別在于:
用到平臺相關(guān)的Node.js native
依賴怀大,即依賴需要在相應平臺下編譯(Windows / macOS / Linux ...)的纱兑,務必注意:如果使用全量上傳而不是云端安裝依賴,則需在 Linux 平臺(CentOS 7 最佳)下編譯后再上傳化借,否則可能出現(xiàn)環(huán)境兼容性問題潜慎。即涉及到Node.js native
依賴的,最好選擇 云端安裝依賴(不上傳node_modules)屏鳍。
總結(jié)
微信云開發(fā)入門很簡單勘纯,但是想要熟練使用,必須對Node.js語法進一步學習钓瞭,結(jié)合自己小程序的業(yè)務需求驳遵,不斷的去解決問題,就能很快的上手云開發(fā)了山涡。
結(jié)尾
既然您看到這了堤结,說明文章對你還有吸引力,幫忙點個贊再走吧鸭丛,謝謝竞穷!
關(guān)注我的公眾號「掉隊程序員」,持續(xù)輸出更多內(nèi)容鳞溉!
自己動手寫瘾带,分解項目中的各個模塊需求,通過查文檔和搜索Cocos社區(qū)熟菲,解決碰到的問題看政,最終在微信上線了下面這款微信小游戲《成語錦衣衛(wèi)》,歡迎大家掃碼體驗抄罕,并作為參考項目模版允蚣,開發(fā)出屬于自己的小游戲
預告
下一節(jié)和朋友們說一說:Cocos Creator集成微信云開發(fā)和調(diào)用微信開放能力