小程序雲開發小記
現在雲開發是越來越火了,剛好最近在做一個小程序雲開發的項目,就記錄一下心得和遇到的問題! 😄
小程序雲開發與普通的開發有什么區別?
最大的區別就是把數據庫搬到了雲上,而且可以讓前端直接操作數據庫,讓前端開發者某種意義上成為了全棧工程師! 👍
雲開發新增了兩個關鍵的知識點:雲函數和雲數據庫操作。
雲函數
雲函數, 顧名思義:就是放到雲服務器上的函數,然后小程序可以通過
wx.cloud.callFunction的方法調用,非小程序端,也可以通過http請求調用雲函數。
雲函數的開發流程一般如下: 小程序本地編寫函數 -> 本地調試 -> 點擊上傳函數。具體細節官方介紹得很清楚,可以看這里;
雲函數 tip
一般來說,一個文件夾對應一個雲函數; 當然你也可以一個文件夾寫多個函數,每個函數export一個函數名,然后在index.js中通過不同的請求參數名來調用不同的函數。
// 一個文件夾對應多個函數的情況
// test.js
module.exports = async (event, context)=> {
console.log('this is test.js');
}
// index.js
const test = require('./test.js');
const controller = {test};
const cloud = require("wx-server-sdk");
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
});
exports.main = async (event, context) => {
const { action } = event;
try {
return (await controller[action](event, context))
} catch (err) {
console.log(err);
return err;
}
};
// 小程序端調用
wx.cloud.callFunction({
name:'xxx', // 這里寫雲函數的文件夾名稱
data:{
action:'test',
paramt:'xxx', // 其他自定義參數
}
})
雲函數所在的文件夾是可以安裝
npm,一般來說雲函數都會依賴wx-server-sdk這個庫,所以本地要安裝依賴。
如果依賴沒有安裝,那么本地調試是用不了的。但是我們上傳雲函數的時候,是可以不上傳這些依賴的!
雲函數 定時
雲函數是可以定時的,需要在雲函數的根目錄添加一個定時觸發器的配置,新建一個
config.json, 格式內容如下:
{
// triggers 字段是觸發器數組,目前僅支持一個觸發器,即數組只能填寫一個,不可添加多個
"triggers": [
{
// name: 觸發器的名字,規則見下方說明
"name": "myTrigger",
// type: 觸發器類型,目前僅支持 timer (即 定時觸發器)
"type": "timer",
// config: 觸發器配置,在定時觸發器下,config 格式為 cron 表達式,規則見下方說明
"config": "0 0 2 1 * * *"
}
]
}
注意: 雲函數觸發器要在小程序端點擊右鍵選擇
上傳觸發器,如果只是選擇上傳雲函數,是沒有效果的; 另外要注意的是config的cron格式;格式如果不對,定時的時間可能不會達到預期的效果。具體看這里
善於利用console和日志查看雲函數bug
雖然雲函數可以本地調試,但不能保證到了雲環境中不會報錯。這個時候就可以在雲開發控制台中的日志查看,可以在關鍵的地方用console打印調試的信息。
什么地方使用雲函數
使用雲函數的好處是不用審核就能直接更新,不像小程序更新還要等待審核。以下的幾種情況都可以用雲函數:
- 對數據庫的寫入操作,應該用雲函數來解決;
- 數據庫的讀取,可以用雲函數,也可以在小程序本地,看情況;
- 復雜的邏輯關系操作,應該放在雲函數中,比如:登錄;購物車;下單等操作;
- 第三方的接口對接,也可以寫在雲函數中;
雲數據庫
關於數據庫,騰訊有自己的一套sdk使用,有很多的語句和方法可以用,對於數據庫不熟練的前端來說,確實有些壓力,需要花多點時間學習,也可以請教認識的后台同事。這里我直接貼上地址,你們慢慢學習傳送門
值得注意的地方
雲數據庫在小程序和雲函數上的操作方式都是一樣的,但有個地方需要注意的:在初始化數據庫的時候,最好指定雲環境的id,一般來說我們都是會建立兩個不同的雲環境的,一個測試,一個正式,但在切換的時候,如果數據庫沒有指定相應的環境,是會默認讀取第一個環境的!!!
還有一個坑,有的人認為在初始化雲的時候指定環境 就可以了,其實不完全正確,具體來說,這樣只會切換對應的雲函數和數據庫的讀操作,如果涉及數據庫的寫操作,還是要再指定一下對應的雲環境。。。 😂
// 小程序的指定雲環境
// 1. 在app.onLaunch 的時候初始化
wx.init.cloud({
env: process.env.NODE_ENV === "development"? "測試環境id":"正式環境id"
});
const db = wx.cloud.database({
env: process.env.NODE_ENV === "development"? "測試環境id":"正式環境id"
});
// 雲函數中指定雲環境
const cloud = require('wx-server-sdk');
cloud.init({
env:cloud.DYNAMIC_CURRENT_ENV
});
const {ENV} = cloud.getWXContext();
// 注意這里是不能用 cloud.DYNAMIC_CURRENT_ENV , 因為它的類型是symbol, 而參數要求是string類型
const db = cloud.database({
env: ENV
});
其他需要注意的點
關於Date日期的時區問題
在雲環境中,new Date()的時區是UTC+0 時區,不是我們常見的UTC+8 時區,這點是需要注意的,之前沒有發現,是因為數據庫存的是時間戳,而時間戳是沒有時區問題。
