腾讯云提出的云开发应该已经有一段时间。至于serverless是什么?不懂的同学可以移步至phodal大神的serverless。腾讯云借助于小程序快速发展走一波serverless。
它的优势在于弱化后端和运维概念,让小企业和小团队可以更容易地开发小程序。它首创的云调用将鉴权部分有效的封装,让你的接口很容易的实现了鉴权保护。当然,大公司或者是具有成熟后台团队的公司,肯定不愿意将数据放在腾讯的服务端,而且现在小程序云开发声明收费事宜,具体可以参考配额。以国外的serverless服务的情况来看,都是按流量计费,借于腾讯的流量,云开发所消耗的费用也是一笔不小的数目,当然那也是后话。哪有用别人东西不收费的情况,而且它还是“腾讯”。
开始前,需要在你的代码库里面新建一个server的文件夹,如果你采用了第三方的框架,请你自行想一下解决方案。开发之前要搞清楚,你的代码是写在server
还是写在client
里面,分别参考对应服务端API和小程序端API。我相信有node开发经验的同学应该很清楚这部分。如果涉及到远程调度的同学,HTTP API 文档则是提供服务端调用的API,远程控制数据库以及数据导出迁移功能。
在这里,着重介绍一下,云函数和云调用。
云函数
云函数是指运行在云端的代码,也就是你server
文件夹里面的代码。
如果你了解不用云开发的openid获取流程,你就知道openid的获取是非常繁琐的过程,前端需要用过wx.login
获取一个code值,code
值具有时效性。通过code值去后台用appsecret去调取openid
和sessionkey
。unionid
的获取就更为复杂。
但是云函数由于是部署在腾讯云的关系,所以无需维护复杂的鉴权机制,云函数会带上特殊的签名机制,即可获取天然可信任的用户登录态,代码如下,注意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 + b
return {
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秒的有效期,要定时去获取。对于小程序而言,测试和生产如果共用一个小程序,会有冲突的风险。这部分的处理是需要非常小心的。
云调用的使用则是减轻这些功能的使用难度,无需获取access token
。openapi
的使用让小程序更面向前端,方便前端工程师的开发。下面是关于消息模版推送的代码。在开发之前需要配置一下权限,详情参考。
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
}
网友评论