微信小游戲開發(fā)之使用云開發(fā)作為后臺服務

主題

結(jié)合官方文檔点楼,介紹微信云開發(fā)的使用宠纯,并補充了文檔中沒有講清楚的部分

特別說明

CocosCreator微信小游戲開發(fā)系列文章对雪,是我在逐步開發(fā)過程中怜庸,基于官方文檔之上当犯,記錄一些重點內(nèi)容,以及對官方文檔中有些知識點的補充和分析割疾。

正文

1. 在微信開發(fā)者工具中創(chuàng)建并配置云開發(fā)項目

先在微信開發(fā)者工具中創(chuàng)建一個小游戲項目嚎卫,如下圖:

創(chuàng)建小游戲項目

圖中的AppID,如果還沒有注冊的,需要先到微信公眾平臺注冊一個小程序拓诸,因為使用測試號生成的AppID侵佃,無法看到圖中的“后端服務->小程序-云開發(fā)”選項。

小游戲項目結(jié)構(gòu)目錄

項目創(chuàng)建好并打開項目后如上圖所示奠支,看到 cloudfunction 目錄提示“未選擇環(huán)境”馋辈,是因為你還沒開通云開發(fā),點擊上圖紅色框中的“云開發(fā)”倍谜,會彈出“云開發(fā)控制臺”迈螟,直接選擇“開通”。如果開通了還是沒有綁定環(huán)境尔崔,可以關(guān)閉再重新打開項目答毫。

開通云開發(fā)

開通后,會彈出協(xié)議彈窗(有興趣的可以點進去看看)季春,直接“同意”洗搂,需要填寫創(chuàng)建新環(huán)境需要的名稱和付費套餐,付費套餐都有免費額度载弄,未超過免費額度不收費耘拇,所以我直接選擇的個人預付費,套餐計費詳情可以點這里宇攻,如下圖:

選擇付費方式
選擇付費套餐

根據(jù)個人情況選擇套餐就好了惫叛,提交訂單,然后耐心等待環(huán)境初始化尺碰。

云開發(fā)控制臺

云開發(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)鍵字有什么作用呢臭猜?

asyncawait關(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é)果。

注意: 這里只是簡單介紹了asyncawait關(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)用微信開放能力

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市呆贿,隨后出現(xiàn)的幾起案子嚷兔,更是在濱河造成了極大的恐慌,老刑警劉巖做入,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冒晰,死亡現(xiàn)場離奇詭異,居然都是意外死亡竟块,警方通過查閱死者的電腦和手機翩剪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彩郊,“玉大人前弯,你說我怎么就攤上這事★牛” “怎么了恕出?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長违帆。 經(jīng)常有香客問我浙巫,道長,這世上最難降的妖魔是什么刷后? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任的畴,我火速辦了婚禮,結(jié)果婚禮上尝胆,老公的妹妹穿的比我還像新娘丧裁。我一直安慰自己,他們只是感情好含衔,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布煎娇。 她就那樣靜靜地躺著,像睡著了一般贪染。 火紅的嫁衣襯著肌膚如雪缓呛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天杭隙,我揣著相機與錄音哟绊,去河邊找鬼。 笑死痰憎,一個胖子當著我的面吹牛票髓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播信殊,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼炬称,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了涡拘?” 一聲冷哼從身側(cè)響起玲躯,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鳄乏,沒想到半個月后跷车,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡橱野,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年朽缴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片水援。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡密强,死狀恐怖茅郎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情或渤,我是刑警寧澤系冗,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站薪鹦,受9級特大地震影響掌敬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜池磁,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一奔害、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧地熄,春花似錦华临、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至跛梗,卻和暖如春寻馏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背核偿。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工诚欠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漾岳。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓轰绵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尼荆。 傳聞我的和親對象是個殘疾皇子左腔,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容