騰訊雲 wafer2 上手,輕鬆部署小程式後端!

SouthernBox發表於2017-09-27

前端程式設計師開發一個自己的小程式,比起學習小程式開發,更大的難點在於搭建小程式的後臺。

本文從一個初學者的角度,簡單介紹一下騰訊雲推出的小程式解決方案 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 使用門檻低,但現在還不夠穩定。個人專案玩玩還是可以的,商業專案要用的話,建議再觀察一段時間吧。

相關文章