前端程式設計師開發一個自己的小程式,比起學習小程式開發,更大的難點在於搭建小程式的後臺。
本文從一個初學者的角度,簡單介紹一下騰訊雲推出的小程式解決方案 wafer2,讓沒有後臺開發經驗的程式設計師,也能搭建起自己的小程式後臺。
簡介
wafer
後臺的搭建涉及到購買伺服器、購買資料庫,然後要在伺服器上安裝執行環境等。說實話,我連要在伺服器上裝什麼都不知道。所以希望能有一個東西,幫我把這些都做好,要是再提供一些登入之類的常用介面就更好了。這就是 wafer 所做的。
其實在小程式後臺配置域名的地方,就有跳轉到騰訊雲的連結:
進入後按照指引購買,就可以擁有一個配置好的後臺。
wafer2
wafer 相對於自己搭建後臺已經方便很多了,但我用起來還是感覺有難度。我不熟悉 Linux,也搞不懂如何測試程式碼。直到發現騰訊雲又推出了 wafer2。
如果你用上了新版小程式開發工具,會在工具的右上角發現一個「騰訊雲」的按鈕:
這個按鈕就是用來連線 wafer2 的。
我們可以直接在小程式開發工具裡編寫後臺程式碼,並上傳程式碼,後臺是區分開發環境和生產環境的。
下面我們看看怎麼使用 wafer2。
搭建
開發環境
搭建 wafer2 很簡單,大家按照官方文件來,應該沒什麼問題的,這裡就不贅述了。
生產環境
官方文件說的都是開發環境,要是你想部署到生產環境,有些配置需要改一下。
域名
開發環境的域名是騰訊雲分配的 xxx.qcloud.la,而生產環境需要使用自己在騰訊雲裡的域名。
通過騰訊雲管理中心註冊的域名,會自動部署 HTTPS 證照。但是要備案的話,需要登記伺服器 ip,而 wafer2 的伺服器 ip 是沒有提供給我們的。目前備案只能再買一個伺服器......
繫結域名後,可以在開發工具「詳情」-「騰訊雲狀態」確認生產環境域名:
切換到生產環境後,別忘了把客戶端的介面域名也改一下。
資料庫
在騰訊雲管理中心裡,修改生產環境 MySql 的登入密碼。然後登入 phpMyAdmin,在首頁可以看到 MySql 的伺服器 ip 地址,記下來。
回到開發工具,找到 server/config.js,修改裡面 MySql 配置的 ip 地址及登入密碼:
mysql: {
host: '修改為生產環境 ip',
port: 3306,
user: 'root',
db: 'cAuth',
pass: '修改為生產環境密碼',
char: 'utf8mb4'
},複製程式碼
在開發工具上傳正式程式碼,再到管理中心的生產環境,點選「程式碼部署」。這樣就完成生產環境的配置及部署了。
比外需要注意,開發環境的 MySql 是 5.7 的,而生產環境是 5.6 的。注意不要在開發的時候使用 JSON 等 MySql 5.7 才有的功能。
登入
先說一下小程式基本都會用到的登入。
使用
wafer2 的客戶端及服務端 sdk,已經整合了登入邏輯,在客戶端引用 sdk 後,只要呼叫它的 login 方法就可以實現登入了:
qcloud.login({
success: res => {
console.log('登入成功', res)
},
fail: err => {
console.log('登入失敗', err)
}
})複製程式碼
登入成功會將使用者資料儲存在資料庫 cAuth 的 cSessionInfo 表裡,並將使用者資料返回。
看起來很美好,但是這裡面是存在一些問題的。
問題
使用者登入過之後會將使用者資訊快取在本地,當有快取的時候會將使用者資訊直接返回。但是 sdk 中,快取的存取都是有問題的,有快取的情況下,會返回 undifined。
這是個很低階的錯誤,問題已經給官方反饋了。截止到寫這篇文章,取資料的地方改了,但存的地方還沒改......
所以現在要正常使用,需要到 wafer2-client-sdk/lib/login.js,找到儲存使用者資料的地方:
Session.set(res.skey);複製程式碼
修改為:
Session.set(res);複製程式碼
另外,還想吐槽一下,sdk 裡 wx.login 和 wx.getUserInfo 是搭配使用的。
也就是說,必須要獲取到使用者資訊,才能實現登入。而我們知道,小程式在獲取使用者資訊時會彈窗,並且使用者是可以拒絕的。拒絕後一段時間內,呼叫 wx.getUserInfo 都不會再彈窗。可以說 wafer2 沒有考慮使用者拒絕授權的情況。而這恰好是微信不提倡的做法,甚至可能導致無法通過稽核。
這個問題我也向官方反饋了。
第一個介面
學習要有目的性才能保持興趣,配置完了我們來寫一個自己的介面。
wafer2 基於 Node.js 平臺,使用了 Koa2 框架。
在 server/controllers 下新建檔案 hello.js,輸入如下程式碼:
module.exports = async ctx => {
ctx.state.data = "Hello World !"
}複製程式碼
程式碼很簡單,就是暴露一個返回結果是「Hello World !」的方法,「Hello World !」會被放在請求結果的 data 裡。
然後我們開啟 server/routes/index.js
新增一句程式碼:
// 測試介面
router.get('/hello', controllers.hello)複製程式碼
程式碼就只有這麼多。儲存之後點選「騰訊雲」-「上傳測試程式碼」,如果是第一次上傳要勾上「部署後自動安裝依賴」。等待上傳成功,就可以測試我們的介面了。
呼叫 xxx.qcloud.la/weapp/hello,看是否返回以下結果:
{
code: 0,
data: "Hello World !"
}複製程式碼
恭喜!你自己開發的第一個介面已經調通了!
資料庫操作
wafer2 使用了 knex 作為資料庫的查詢構造器,並且已經配置好了。對於有 sql 經驗的程式設計師,可以很快的上手。
我們可以在 phpMyAdmin 裡,在 cAppinfo 這個資料庫裡建立需要的表。
假如已經有一個「Book」的表,下面程式碼,簡單展示了在 wafer2 裡,如何對資料庫進行增查改刪:
const { mysql } = require('../qcloud')
const uuid = require('node-uuid')
module.exports = async ctx => {
var id = uuid.v1()
// 增
var book = {
id: id,
name: "冰與火之歌",
price: 88
}
await mysql("Book").insert(book)
// 查
var res = await mysql("Book").where({ id }).first()
// 改
await mysql("Book").update({ price: 66 }).where({ id })
// 刪
await mysql("Book").del().where({ id })
ctx.state.data = "OK"
}複製程式碼
資料庫操作預設都是非同步執行的,如果要等待操作完成,需要在操作語句前加上 await。
更高階的 sql 用法,可以檢視 knex.js 官網。
總結
我已經將自己的小程式「碰詞er」後臺遷移到 wafer2 了。開發的時候各種坑,給騰訊雲提了一些很明顯的 bug。說不定「碰詞er」是第一個使用 wafer2 的小程式。
wafer2 用起來方便。我們不用懂太多後臺配置的東西,前後端程式碼都在小程式開發工具編寫,直接在開發工具上傳後端程式碼,區分了開發、生產環境,而且目前還是免費的,雖說不知道會不會一直有免費版。
但目前缺點同樣明顯,比如備案不方便,登入介面不合理,sdk 有 bug 等。我還碰到伺服器當機,需要重啟的情況。希望騰訊雲接下來能解決這些問題。
總的來說,wafer2 使用門檻低,但現在還不夠穩定。個人專案玩玩還是可以的,商業專案要用的話,建議再觀察一段時間吧。