微信小程序笔记六: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 + 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 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
}

你可能感兴趣的:(微信小程序笔记六:serverless 云开发)