目录

小程序云开发

想着小程序云开发的设计对于应用层开发者实在是太友好了,不论是关键字的选择与变量、函数名等命名都与我们对应用层开发的命名原则有高度的一致,以及语法糖、callback、promise等写法简洁自然,大道至简。

之前有人问我们什么是云开发,我们整理了一篇文章serverless和云开发是什么 - 9ong,又想着写个简单的小程序云开发入门的文章,然后再看一次官方文档,觉得哪有必要,自从几年前深入微信小程序的开发,对微信小程序的文档赞不绝口,如今云开发依旧犀利简洁,甚至很快有了各种入门案例,门槛低到非计算机行业的童鞋都能读懂看懂,能按照其文档描述完成一个demo实现,对于计算机行业的开发者,上手云开发更不在话下,主要还是基础的掌握与原理的理解,在遇到复杂或更深层的问题时,才能灵活使用提出解决方案。

小程序云开发,相当于在云端部署了个Nodejs的环境,我们在本地编写miniprogram的小程序端js代码,在cloundFunctions中编写云函数,仍然是js代码。当然云开发我们也可以部署其他语言的环境,比如php,但小程序这边我们完全可以考虑全端使用js即可。

如果你是零基础的技术爱好者,想学习一门编程语言用于工作或生活,通常Python、PHP、JavaScript、C#、Swift、Java都是比较不错的选择,而相比这些编程方向,云开发除了更容易上手以外,还能更快且免费的做出一个功能完整且实用的技术作品。

云开发快速入门

云开发快速入门 | 微信开放社区

云开发能力基础讲解

云开发能力基础讲解 | 微信开放社区

  • 支持云函数本地调试
  • 支持云函数云端测试
  • 支持两个环境,支持测试与正式环境
  • 云函数编码不支持success与fail的callback方式,只支持promise的返回
  • 第一次部署云函数之后,再修改云函数代码,建议更新对应文件即可(增量)
  • 删除云函数后,至少10分钟之后再创建相同名称的云函数,否则会出现调用失败问题

注意

  • 第二步的本地调试云函数,进入本地调试后,在右侧面板选择请求方式为:手动触发,意味着以下的请求参数可以通过json串手动传参。
  • 在app.js中填写环境id后,如果cloundFunctions目录上的当前环境还没有改变,尝试多次编译或重新开启IDE,可以得到解决。

云开发数据库入门讲解

云开发数据库入门讲解 | 微信开放社区

用过php的几个框架,这些框架的数据库操作往往被我们改造成类似小程序云开发数据库的链式,where、orderby、limit、fields简洁的1到2个数值或字符串参数,而复杂的参数统一改造成数组传参(php数组太强大),易于开发理解与使用,大大提高使用框架操作数据库的开发效率,至于性能,除了sql语句的组织编排外,大多和框架无关,索引、数据库读写分离与负载均衡等,处理的好该快就快,处理不好该慢还是慢,在数据库天花板后,考虑异步。

小程序开发工具,还能检查索引并提高建议加什么索引,单字段索引,还是联合索引,甚至降序升序,还前缀索引,覆盖索引的考虑,可真是奔着想让后端设计开发者事业哈。

注意:

  • 云数据库提供了多个数据权限,如果代码确认没有问题,但始终没有数据返回,且不报错,那需要检查下集合的数据权限,这种权限问题,查询还是会成功的,但返回0条数据,并不会去报错,这是官方对于权限问题的有所考虑,可能会自动补充_openid为当前用户openid的查询条件。
  • 逻辑或or的写法
  • 模糊查询使用正则表达式
  • 同样数据库操作也可以在云函数里操作,大体语法是一样的,

小程序云开发提供的数据库是类MongoDB的nosql文档型数据库。

云数据库 mysql
数据库database 数据库database
集合collection 表table
字段field 列column/field
记录record/doc 记录row

云开发云存储入门讲解

云开发云存储入门讲解 | 微信开放社区

示例是老酒新瓶装,文件存储与数据库相结合的网盘例子。

这个示例中的网盘小程序的数据库设计,事先将用户信息、上传的所有文件、照片等信息通过json数据结构罗列出来,不论是采用关系型数据库进行设计或是NoSql数据库设计,脑海中都会有个信息框架,更有利于数据库设计。

这文档其实就将云存储上传与下载使用即可,前面的文档都是低门槛通俗易懂,这个文档虽然对专业开发者没有问题,对于小白来说还是很困难的,不用去结合数据库绑定云存储文件。

注意:

  • 上传文件到云存储,就两个动作,而且这两个动作在微信小程序开发中,代码框架基本是确定稳定的。

    • 首先把文件上传到小程序的临时文件,并获取临时文件地址以及文件的名称;
    • 将临时文件上传到云存储指定云文件里,并获取到文件的 FileID;
  • 使用云开发来下载云存储里面的文件,就不会有域名校验备案的问题.

云开发基础NodeJS

云开发基础NodeJS | 微信开放社区

  • Nodejs内置常用的模块:

    • fs 模块:文件目录的创建、删除、查询以及文件的读取和写入,下面的 - createReadStream 方法类似于读取文件,
    • path 模块:提供了一些用于处理文件路径的 API
    • url 模块:用于处理与解析 URL
    • http 模块:用于创建一个能够处理和响应 http 响应的服务
    • querystring 模块:解析查询字符串
    • until 模块 :提供用于解析和格式化 URL 查询字符串的实用工具;
    • net 模块:用于创建基于流的 TCP 或 IPC 的服务器
    • crypto 模块:提供加密功能,包括对 OpenSSL 的哈希、HMAC、加密、解- 密、签名、以及验证功能的一整套封装
  • module、exports、require

  • Lodash 实用工具库。通过降低 array、number、objects、string 等数据类型的使用难度从而让 JavaScript 变得更简单。

  • moment 时间处理。开发小程序时经常需要格式化时间、处理相对时间、日历时间以及时间的多语言问题,这个时候就可以使用比较流行的 momentjs 了。

  • Buffer 文件流

  • 图像处理 sharp。sharp 是一个高速图像处理库,可以很方便的实现图片编辑操作,如裁剪、格式转换、旋转变换、滤镜添加、图片合成(如添加水印)、图片拼接等,支持 JPEG, PNG, WebP, TIFF, GIF 和 SVG 格式。

  • 连接数据库

  • 二维码 qrcode

  • 邮件处理 nodemailer

  • Excel 文档处理 node-xlsx

  • HTTP 处理(got、superagent、request、axios、request-promise)

  • 加解密 Crypto。crypto 模块是 nodejs 的核心模块之一,它提供了安全相关的功能,包含对 OpenSSL 的哈希、HMAC、加密、解密、签名、以及验证功能的一整套封装。由于 crypto 模块是内置模块,我们引入它是无需下载,就可以直接引入。

  • 发短信(qcloudsms_js)

nodejs与php最为相似了,都是脚本,常用的库或模块,都是这些,nodejs将会一直吃移动开发中php的份额。

云开发基础

云开发基础 | 微信开放社区

可以根据自己能力,调整倍数,小白按正常速度,5年以上微信生态开发者1.5倍数甚至2倍数。由于我们已经比较了解,所以2倍数完全没有问题。

从这里开始以下5篇都是视频讲解。

云开发基础能力展示

云开发基础能力展示 | 微信开放社区

云开发基础能力之数据库权限管理

云开发基础能力之数据库权限管理 | 微信开放社区

云开发基础能力展示之文件存储

云开发基础能力展示之文件存储 | 微信开放社区

云开发基础能力展示之云函数定时器的使用

云开发基础能力展示之云函数定时器的使用 | 微信开放社区

面向重复执行的功能,定时定期执行。

触发器config.json的配置,注意config的配置格式和linux的crontab有点类似,crontab定义规则:分、时、日、月、星期,云函数定时器config的定义规则是:秒、分、时、日、月、星期、年

Linux-cron计划任务服务详细介绍 - 9ong

云函数应用课程·在云函数中查询数据

云函数应用课程·在云函数中查询数据 | 微信开放社区

云开发安全规则讲解

云开发安全规则讲解 | 微信开放社区

由于云开发中小程序具备可以操作数据库的能力,所以对小程序操作数据库的权限有比较精细化的权限设置,保证数据的安全。

云开发的前端(小程序与web端)直连数据库查询数据时,都少不了openid条件查询,它是必不可少的,但在云端连接数据库查询,则不受安全规则限制(相当于传统服务器具有数据库更多的权限,比如对所有数据的增删改查,当然这个看数据库提供给后端的权限)。

本篇中,关注安全规则的写法。

前提知识点openid的一致性:auth.openid表示的是登录用户的 openid,而doc._openid表示的是当前记录_openid这个字段的值,当用户的 openid 与当前记录的_openid 值相同时,就对该记录有权限。

范例:

这个安全规则的意思是:记录创建者可以读写,这条记录里的teacher(也是一个用户)也可以读写(学生的老师可以读写学生的信息与作业)


//文档的结构

{

  _id:"handwork20201020",

  _openid:"学生的openid", //学生为记录的创建者,

  teacher:"老师的openid" //该学生被指定的老师的openid

}

//安全规则

{

  "read": "doc.teacher == auth.openid || doc._openid == auth.openid",

  //"read": "doc.teacher in auth.openid || doc._openid == auth.openid",//注意:in的写法,所有老师都有读这个学生记录的权限

  "write": "doc.teacher == auth.openid || doc._openid == auth.openid",

}

看了这个范例,我们就知道这个安全规则是灵活的,完全可以满足我们任何需求。

**这里要再强调的是前端(小程序端)的 where 条件必须是安全规则权限的子集。**也就是说前端的查询条件,如果超出安全规则限制的条件,将不会有数据返回。

云开发数据库设计指导

云开发数据库设计指导 | 微信开放社区

对于应用级的开发,开发者要注重存储数据结构的设计,应用功能抽象到最后就是底层数据结构的设计,传统考虑关系型数据库设计,库表字段,一级一级下沉,现在对于小应用越来越多地使用NoSql的存储方式(json数据结构,现在很多关系型数据库也支持json数据结构直接存储)。

我们可以通过一个json数据结构表示我们的应用,之后再逐步拆分成不同模块的不同json数据结构,也就自然而然有了一个个集合、字段的设计。

优秀的数据存储结构设计,会让应用层开发事半功倍。范式、反范式都是根据应用设计情况而定的,但总是有规则或原则去遵循。

云调用能力——订阅消息的讲解

云调用能力——订阅消息的讲解 | 微信开放社区

通过云函数实现消息订阅。

注意:云函数config.json中permissions的配置。需要哪些接口权限,可以参考云调用接口列表

云开发实时数据推送讲解

云开发实时数据推送讲解 | 微信开放社区

这篇讲解的是数据推送,不是消息推送。我们先看下这个数据推送的使用场景。

实时推送场景:聊天、广播、即时通信、弹幕、点赞、礼物、评论、多人互动、协作、实时共享等等需要实时数据更新的场景。

对于传统的实时数据推送场景,需要开发自行搭建长连接socket服务,需要运维、需要额外后端编码处理数据接收与推送等非业务逻辑代码。

注意:

  • 推送仅只支持前端(小程序端与web端,不支持云函数)
  • 不要滥用
  • 注意数据库集合权限设置(自定义规则),无法监听只读的非自己创建的数据。
  • 查询监听不支持到field粒度,但支持where、orderby、limit。
  • 尽量只监听必要的数据。
  • 一次监听查询记录数上限为5000,不受小程序端默认20条的限制。

Collection: Object | watch | 微信开放文档

效果:在小程序开发工具中开启多账号调试(开发者工具栏-工具-多账号调试),当第三个用户点赞后,另外前面两个用户也能实时收到点赞数据的变化。

小程序云开发数据推送.gif (1136×596)

通俗点说就是前端(小程序端、web端)订阅/watch数据记录更新,数据记录一旦更新,将会推送数据给前端,在onChange回调处理数据推送。

数据库原子操作和事务讲解

数据库原子操作和事务讲解 | 微信开放社区

  • nosql有一个好处,一条记录可以满足实现以前关系型数据库多条记录,避免多次更新,只要一次更新即可,还都具备原子性,不用考虑事务
  • 事务是必须满足 4 个条件(ACID): Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)。明明白白事务ACID - 9ong
  • 云开发采用的是快照隔离(事务期间可重复读),级别高于读提交

对于保证跨记录操作的原子性,需要用到事务。

云开发提供了两套事务API

  • 通过 runTransaction 回调获得 transaction
  • 通过 startTransaction 获得 transaction

数据库性能优化指导

数据库性能优化指导 | 微信开放社区

都是非常好的建议,不论是传统关系型数据库或是文档型数据库,都很适合的优化原则。

对比参考关系型数据库mysql的优化原则:mysql优化全面梳理 - 9ongmysql实战阅读笔记 - 9ongmysql理论实战文章索引 - 9ong

云开发云调用快速入门

云开发云调用快速入门 | 微信开放社区

云调用简化了传统服务端上需要检查获取access_token并缓存供后续使用的步骤。

  • 在云函数配置文件中添加接口权限

    
    "permissions": {
    
      "openapi": [
    
        "subscribeMessage.send",
    
        "security.imgSecCheck"
    
      ]
    
    },
    
  • 使用云函数处理,比如发送订阅消息直接调用cloud.openapi.subscribeMessage.send

云调用能力—小程序码的讲解

云调用能力—小程序码的讲解 | 微信开放社区

也是为了简化小程序码的生成,不需要复杂的鉴权及各种规则,通过服务端云函数可以获取一个小程序任意页面的小程序码,扫描该小程序码就可以直接进入小程序对应的页面,所有生成的小程序码永久有效,可长期使用。

  • wxacode.get,适用于需要的码数量较少的业务场景,可接受 path 参数较长,页面路径最大长度 128 字节;生成的小程序码永久有效,个数有限。
  • wxacode.getUnlimited,获取小程序码,适用于需要的码数量极多的业务场景。生成的小程序码,永久有效,数量暂无限制,但是此方法只支持 32 个字符。
  • wxacode.createQRCode(不推荐使用),和 wxacode.get 类似,只是生成的不是小程序码,而是小程序的二维码

wxacode.get 和 wxacode.createQRCode 总共生成的码数量限制为 10 万个,也就是究极你的小程序的一生,只能通过这两种方式生成 10 万个小程序码和小程序二维码,不过如果参数相同,是不算次数的,所以 10 万个还是挺多的。

通过云调用实现小程序码生成逻辑:

  • 云函数添加生成小程序码接口权限
  • 小程序端调用云函数
  • 云函数根据小程序端提供的path,调用cloud.openapi.wxacode.get生成小程序码
  • 云函数调用云存储接口cloud.uploadFile上传小程序码,获得云存储FileID
  • 云函数返回FileID给小程序端渲染
  • 小程序端缓存小程序码(可根据路径变更频率或概率决定缓存时间)

云调用能力—图像处理和OCR

云调用能力—图像处理和OCR | 微信开放社区

  • 支持识别二维码图片内容及信息。cloud.openapi.img.scanQRCode

  • 支持OCR人工智能识别。cloud.openapi.ocr.printedText

    注意:在这里开通微信OCR识别 | 微信服务平台

  • 图像处理能力:缩放旋转裁剪滤镜水印等传统图片编辑器能做的事

    • 云开发图像处理能力结合的是腾讯云数据万象的图片解决方案

    • 云开发图像地址支持参数拼接处理图片的能力,比如imageMogr2

      看范例,比文字更能理解。(类似于阿里云、七牛云、又拍云等提供的图片存储链接参数处理方式)

      download_url是图片原地址。

      //缩放宽度,高度不变,下面案例为宽度为原图50%,高度不变
      download_url&imageMogr2/thumbnail/!50px
      
      //缩放高度,宽度不变,下面案例为高度为原图50%,宽度不变
      download_url&imageMogr2/thumbnail/!x50p
      
      
  • 小程序端持久化图像处理

    把缩放、裁剪、旋转、格式变换等图像处理的结果(也就是处理之后的图片)存储到云存储,这个就叫做持久化图像处理

  • 云函数持久化图像处理

    云函数的处理图片的场景和小程序端处理图片的场景会有所不同,小程序端主要用于当用于上传图片时就对图片进行处理,云函数则主要用于从第三方下载图片之后进行处理或者对云存储里面的图片进行处理

云调用能力—内容安全检测

云调用能力—内容安全检测 | 微信开放社区

  • 文字内容安全。云函数cloud.openapi.security.msgSecCheck

  • 图片鉴黄。云函数cloud.openapi.security.imgSecCheck

    需要考虑图片传输的耗时以及检测的图片不能大于 1M 这样的一个限制,当图片尺寸比较大时,我们需要对图片进行压缩处理。而且要检测的图片文件的格式为 PNG、JPEG、JPG、GIF,图片尺寸不超过 750px x 1334px。

  • 图像内容安全拓展能力

    • 云开发图像安全审核的拓展能力。限制上相对宽松些,安全检查能力也更强大更细致。
    • 支持在小程序端使用图像安全审核
    • 支持在云函数端使用图像安全审核

目前内容安全检测都需要上传到云端(云函数或云存储),再通过云函数进行检测返回检测结果,对流量与存储空间有一定的消耗,相对小程序云开发的其他功能还是复杂些,但对于以前传统的三方鉴权检测来说当然是更简单了。