>定義:云函數(shù)即在云端(服務(wù)器端)運(yùn)行的函數(shù)理张。在物理設(shè)計(jì)上,一個(gè)云函數(shù)可由多個(gè)文件組成召廷,占用一定量的?CPU?內(nèi)存等計(jì)算資源凳厢;各云函數(shù)完全獨(dú)立;可分別部署在不同的地區(qū)竞慢。開(kāi)發(fā)者無(wú)需購(gòu)買先紫、搭建服務(wù)器,只需編寫(xiě)函數(shù)代碼并部署到云端即可在小程序端調(diào)用筹煮,同時(shí)云函數(shù)之間也可互相調(diào)用遮精。
一個(gè)云函數(shù)的寫(xiě)法與一個(gè)在本地定義的?JavaScript?方法無(wú)異,代碼運(yùn)行在云端?Node.js?中败潦。當(dāng)云函數(shù)被小程序端調(diào)用時(shí)仑鸥,定義的代碼會(huì)被放在?Node.js?運(yùn)行環(huán)境中執(zhí)行。我們可以如在?Node.js?環(huán)境中使用?JavaScript?一樣在云函數(shù)中進(jìn)行網(wǎng)絡(luò)請(qǐng)求等操作变屁,而且我們還可以通過(guò)云函數(shù)后端?SDK?搭配使用多種服務(wù)眼俊,比如使用云函數(shù)?SDK?中提供的數(shù)據(jù)庫(kù)和存儲(chǔ)?API?進(jìn)行數(shù)據(jù)庫(kù)和存儲(chǔ)的操作,這部分可參考數(shù)據(jù)庫(kù)和存儲(chǔ)后端?API?文檔粟关。
云開(kāi)發(fā)的云函數(shù)的獨(dú)特優(yōu)勢(shì)在于與微信登錄鑒權(quán)的無(wú)縫整合疮胖。當(dāng)小程序端調(diào)用云函數(shù)時(shí),云函數(shù)的傳入?yún)?shù)中會(huì)被注入小程序端用戶的?openid闷板,開(kāi)發(fā)者無(wú)需校驗(yàn)?openid?的正確性因?yàn)槲⑿乓呀?jīng)完成了這部分鑒權(quán)澎灸,開(kāi)發(fā)者可以直接使用該?openid。
###?我的第一個(gè)云函數(shù)
我們以定義一個(gè)將兩個(gè)數(shù)字相加的函數(shù)作為我們第一個(gè)云函數(shù)的示例遮晚。
1.?在項(xiàng)目根目錄找到?project.config.json?文件性昭,新增?cloudfunctionRoot?字段,指定本地已存在的目錄作為云開(kāi)發(fā)的本地根目錄县遣。</br>
???示例
???```json
???{
??????"cloudfunctionRoot":?"cloudfunctions/"
???}
???```
???完成指定之后糜颠,云開(kāi)發(fā)根目錄的圖標(biāo)會(huì)變成?“云開(kāi)發(fā)圖標(biāo)”汹族,云函數(shù)根目錄下的第一級(jí)目錄(云函數(shù)目錄)是與云函數(shù)名字相同的,如果對(duì)應(yīng)的線上環(huán)境存在該云函數(shù)其兴,則我們會(huì)用一個(gè)特殊的?“云圖標(biāo)”?標(biāo)明
2.?接著顶瞒,我們?cè)谠坪瘮?shù)根目錄上右鍵,在右鍵菜單中元旬,可以選擇創(chuàng)建一個(gè)新的?Node.js?云函數(shù)榴徐,我們將該云函數(shù)命名為?add。開(kāi)發(fā)者工具在本地創(chuàng)建出云函數(shù)目錄和入口?index.js?文件匀归,同時(shí)在線上環(huán)境中創(chuàng)建出對(duì)應(yīng)的云函數(shù)坑资。我們可以看到類似如下的一個(gè)云函數(shù)模板:
???示例
```javascript
???//?云函數(shù)入口文件
???const?cloud?=?require('wx-server-sdk')
???cloud.init()
???//?云函數(shù)入口函數(shù)
???exports.main?=?async?(event,?context)?=>?{
?????const?wxContext?=?cloud.getWXContext()
?????return?{
???????event,
???????openid:?wxContext.OPENID,
???????appid:?wxContext.APPID,
???????unionid:?wxContext.UNIONID,
?????}
???}
```
3.?云函數(shù)的傳入?yún)?shù)有兩個(gè),一個(gè)是?event?對(duì)象穆端,一個(gè)是?context?對(duì)象袱贮。event?指的是觸發(fā)云函數(shù)的事件,當(dāng)小程序端調(diào)用云函數(shù)時(shí)徙赢,event?就是小程序端調(diào)用云函數(shù)時(shí)傳入的參數(shù)字柠,外加后端自動(dòng)注入的小程序用戶的?openid?和小程序的?appid探越。context?對(duì)象包含了此處調(diào)用的調(diào)用信息和運(yùn)行狀態(tài)狡赐,可以用它來(lái)了解服務(wù)運(yùn)行的情況。在模板中也默認(rèn)?require?了?wx-server-sdk钦幔,這是一個(gè)幫助我們?cè)谠坪瘮?shù)中操作數(shù)據(jù)庫(kù)枕屉、存儲(chǔ)以及調(diào)用其他云函數(shù)的微信提供的庫(kù)。</br>
我們修改一下模板的返回值:</br>
示例
```javascript
//?...
exports.main?=?async?(event,?context)?=>?{
??//?...
??return?{
????sum:?event.a?+?event.b
??}
}
```
4.?在小程序中調(diào)用這個(gè)云函數(shù)前鲤氢,我們還需要先將該云函數(shù)部署到云端搀擂。在云函數(shù)目錄上右鍵,在右鍵菜單中卷玉,我們可以將云函數(shù)整體打包上傳并部署到線上環(huán)境中哨颂。</br>
部署完成后,我們可以在小程序中調(diào)用該云函數(shù):
```javascript
wx.cloud.callFunction({
??//?云函數(shù)名稱
??name:?'add',
??//?傳給云函數(shù)的參數(shù)
??data:?{
????a:?1,
????b:?2,
??},
??success:?function(res)?{
????console.log(res.result.sum)?//?3
??},
??fail:?console.error
})
```
當(dāng)然相种,Promise?風(fēng)格的調(diào)用也是支持的:
```javascript
wx.cloud.callFunction({
??//?云函數(shù)名稱
??name:?'add',
??//?傳給云函數(shù)的參數(shù)
??data:?{
????a:?1,
????b:?2,
??},
})
.then(res?=>?{
??console.log(res.result)?//?3
})
.catch(console.error)
```
###?注意事項(xiàng)
>不要將cloudfunctionRoot的值設(shè)為工作文件夾威恼,將文件夾設(shè)置為云函數(shù)文件夾,文件夾會(huì)變成云環(huán)境寝并,即在代碼打包和上傳的時(shí)候會(huì)忽略云函數(shù)文件夾箫措。
工作文件夾設(shè)置為云函數(shù)文件夾報(bào)錯(cuò)截圖