微信小程序笔记六(serverless|微信小程序笔记六:serverless 云开发)

腾讯云提出的云开发应该已经有一段时间。至于serverless是什么?不懂的同学可以移步至phodal大神的serverless。腾讯云借助于小程序快速发展走一波serverless。
它的优势在于弱化后端和运维概念,让小企业和小团队可以更容易地开发小程序。它首创的云调用将鉴权部分有效的封装,让你的接口很容易的实现了鉴权保护。当然,大公司或者是具有成熟后台团队的公司,肯定不愿意将数据放在腾讯的服务端,而且现在小程序云开发声明收费事宜,具体可以参考配额。以国外的serverless服务的情况来看,都是按流量计费,借于腾讯的流量,云开发所消耗的费用也是一笔不小的数目,当然那也是后话。哪有用别人东西不收费的情况,而且它还是“腾讯”。

云开发能力从基础库 2.2.3 开始支持(覆盖率 97.3%,查看兼容性问题),所以可以不需要考虑这点兼容性。
开始前,需要在你的代码库里面新建一个server的文件夹,如果你采用了第三方的框架,请你自行想一下解决方案。开发之前要搞清楚,你的代码是写在server还是写在client里面,分别参考对应服务端API和小程序端API。我相信有node开发经验的同学应该很清楚这部分。如果涉及到远程调度的同学,HTTP API 文档则是提供服务端调用的API,远程控制数据库以及数据导出迁移功能。
在这里,着重介绍一下,云函数和云调用。
云函数 云函数是指运行在云端的代码,也就是你server文件夹里面的代码。
如果你了解不用云开发的openid获取流程,你就知道openid的获取是非常繁琐的过程,前端需要用过wx.login获取一个code值,code值具有时效性。通过code值去后台用appsecret去调取openidsessionkeyunionid的获取就更为复杂。
但是云函数由于是部署在腾讯云的关系,所以无需维护复杂的鉴权机制,云函数会带上特殊的签名机制,即可获取天然可信任的用户登录态,代码如下,注意node.js的代码使用common.js的模块化方案。
const cloud = require('wx-server-sdk') exports.main = (event, context) => { const {userInfo, a, b} = event // 这里获取到的 openId 和 appId 是可信的 const {OPENID, APPID} = cloud.getWXContext() const sum = a + breturn { OPENID, APPID, sum } }

云函数的构建就是前端小程序可以直接通过wx.cloud.callFunction调用。这样,团队内不需要后端工程师以及运维人员。
// server.js exports.main = async (event, context) => ({ sum: event.a + event.b })

// client.js wx.cloud.callFunction({ // 云函数名称 name: 'add', // 传给云函数的参数 data: { a: 1, b: 2, }, }) .then(res => { console.log(res.result) // 3 }) .catch(console.error)

云调用 云调用是指需要access token才能调用的供服务端调用的接口,由于access token只有7200秒的有效期,要定时去获取。对于小程序而言,测试和生产如果共用一个小程序,会有冲突的风险。这部分的处理是需要非常小心的。
【微信小程序笔记六(serverless|微信小程序笔记六:serverless 云开发)】云调用的使用则是减轻这些功能的使用难度,无需获取access tokenopenapi的使用让小程序更面向前端,方便前端工程师的开发。下面是关于消息模版推送的代码。在开发之前需要配置一下权限,详情参考。
const cloud = require('wx-server-sdk') cloud.init() exports.main = async (event, context) => { const result = await cloud.openapi.templateMessage.send({ touser: cloud.getWXContext().OPENID, page: 'index', data: { keyword1: { value: '339208499' }, keyword2: { value: '2015年01月05日 12:30' }, keyword3: { value: '腾讯微信总部' }, keyword4: { value: '广州市海珠区新港中路397号' } }, templateId: 'TEMPLATE_ID', formId: 'FORMID', emphasisKeyword: 'keyword1.DATA' }) // result 结构 // { errCode: 0, errMsg: 'openapi.templateMessage.send:ok' } return result }

    推荐阅读