前言
最近申請(qǐng)了個(gè)人小程序,來(lái)做一些記錄个唧,最初打算使用localstorage存在本地就齊活兒了,可是要接定時(shí)推送设预,就選擇了云開(kāi)發(fā)徙歼。之前用的云開(kāi)發(fā)是團(tuán)隊(duì)搭建過(guò)的,這次嘗試自己從頭來(lái)一遍鳖枕,熟悉一下整個(gè)流程魄梯,順便蹚蹚雷。
技術(shù)棧:uniapp v3
開(kāi)發(fā)
第一步
首先肯定是開(kāi)通服務(wù)宾符,開(kāi)發(fā)者工具里點(diǎn)擊云開(kāi)發(fā)酿秸,里面會(huì)有開(kāi)通提示,一步一步走下去就能正常開(kāi)通了魏烫。
設(shè)置云函數(shù)路徑
在manifest.json
里設(shè)置"cloudfunctionRoot": "cloudfunctions/"
辣苏,云函數(shù)可以寫(xiě)在這里肝箱,函數(shù)名稱(chēng)為文件夾,內(nèi)容結(jié)構(gòu)為config.json稀蟋、index.js煌张、package.json
,具體內(nèi)容見(jiàn)下面圖示例
config.json是聲明函數(shù)的配置信息退客,比如接口權(quán)限骏融、定時(shí)觸發(fā)器等;
index.js名稱(chēng)可以修改井辜,是云函數(shù)執(zhí)行入口绎谦;
package.json就是云函數(shù)的具體信息和依賴(lài),執(zhí)行入口可以在里面修改粥脚。
新建云函數(shù)
這里需要注意的是窃肠,uniapp項(xiàng)目在本地新建的文件夾是沒(méi)有辦法同步到云函數(shù)列表去的。云函數(shù)的新建可以在云開(kāi)發(fā)后臺(tái)刷允,也可以在開(kāi)發(fā)者工具里冤留,點(diǎn)擊右鍵有新建云函數(shù)。如果是在后臺(tái)建的函數(shù)树灶,可以點(diǎn)擊同步云函數(shù)列表纤怒。
uniapp在編譯的時(shí)候,cloudfunctions文件夾是不會(huì)編譯到小程序的路徑里去的天通,這就導(dǎo)致一開(kāi)始的時(shí)候不知道該怎么去新建函數(shù)泊窘。如果此時(shí)在開(kāi)發(fā)者工具里新建cloudfunctions文件夾,也是可用的像寒,只是文件夾被建在了dist下面烘豹,無(wú)法同步代碼,因此大聰明選擇了
cp -rf cloudfunctions/ dist/dev/mp-weixin/cloudfunctions
把它整個(gè)copy過(guò)去诺祸,###口袋空空大口大口###這時(shí)候開(kāi)發(fā)者工具里就有我建好的云函數(shù)了携悯。如果文件是新增的沒(méi)有部署過(guò),需要右鍵選擇云函數(shù)增量上傳
筷笨,發(fā)布部署就可以調(diào)用了憔鬼。調(diào)用云函數(shù)
云函數(shù)在調(diào)用之前需要先初始化,否則會(huì)報(bào)錯(cuò)Error: errCode: -1 | errMsg: Cloud API isn't enabled, please call wx.cloud.init first 請(qǐng)先調(diào)用 wx.cloud.init() 完成初始化后再調(diào)用其他云 API仰禀。
侮叮。
wx.cloud.init({
env: 'XXXXXX'
});
// 執(zhí)行云函數(shù)
wx.cloud.callFunction({
name: 'funcitonname', // 對(duì)應(yīng)云函數(shù)的文件夾名稱(chēng)
data: 'params', // 傳參
success: res => {
console.log('云函數(shù)調(diào)用成功,返回?cái)?shù)據(jù)res:', res);
},
fail: err => {
console.error('云函數(shù)調(diào)用失敗', err);
},
});
通知
通過(guò)小程序訂閱消息subscribeMessage.send
來(lái)實(shí)現(xiàn),需要在小程序里授權(quán)訂閱消息requestSubscribeMessage
悼瘾,詳見(jiàn)文檔囊榜。
// 云函數(shù)入口文件
const cloud = require('wx-server-sdk');
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }); // 使用當(dāng)前云環(huán)境
// 云函數(shù)入口函數(shù)
exports.main = async event => {
await cloud.openapi.subscribeMessage.send({
touser: openid,
page: 'pages/index/index',
data: {
thing1: {
value: goods.data[0].name
},
date3: {
value: goods.data[0].expire
}
},
miniprogram_state: 'formal',
templateId: 'templateid'
});
}
return 'success';
};
定時(shí)器
通知實(shí)現(xiàn)了之后审胸,就是定時(shí)推送了,我希望實(shí)現(xiàn)的是每天早上10點(diǎn)發(fā)推送卸勺,這里用到了云函數(shù)的定時(shí)觸發(fā)器砂沛,根據(jù)文檔介紹,修改一下配置曙求。
// config.json
{
"permissions": {
"openapi": []
},
"triggers": [
{
"name": "expireNoticeTrigger",
"type": "timer",
"config": "0 0 10 * * * *"
}
]
}
然而碍庵,只是這樣的話,并不會(huì)如我們所期待的那樣定時(shí)執(zhí)行悟狱。因?yàn)橛|發(fā)器需要單獨(dú)上傳静浴,config.json
右鍵選擇上傳觸發(fā)器就可以正常執(zhí)行了。
結(jié)語(yǔ)
到此處挤渐,需求基本實(shí)現(xiàn)苹享,云開(kāi)發(fā)并沒(méi)有想象的復(fù)雜,但是開(kāi)發(fā)過(guò)程中還是有很多的細(xì)節(jié)點(diǎn)需要注意浴麻。至于云函數(shù)的內(nèi)容得问,就是通過(guò)數(shù)據(jù)庫(kù)做一些基礎(chǔ)的crud,官方文檔介紹的比較詳細(xì)软免,有需要的可以看看宫纬。