w3cschool-微信小程序开发文档-云开发

微信小程序云开发 介绍

2020-07-24 16:19 更新

开发者可以使用云开发开发微信小程序、小游戏,无需搭建服务器,即可使用云端能力。

云开发为开发者提供完整的原生云端支持和微信服务支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,即可实现快速上线和迭代,同时这一能力,同开发者已经使用的云服务相互兼容,并不互斥。

云开发提供了几大基础能力支持:

能力作用说明
云函数 无需自建服务器 在云端运行的代码,微信私有协议天然鉴权,开发者只需编写自身业务逻辑代码
数据库 无需自建数据库 一个既可在小程序前端操作,也能在云函数中读写的 JSON 数据库
存储 无需自建存储和 CDN 在小程序前端直接上传/下载云端文件,在云开发控制台可视化管理
云调用 原生微信服务集成 基于云函数免鉴权使用小程序开放接口的能力,包括服务端调用、获取开放数据等能力

微信小程序云开发 云开发能力

小程序·云开发提供了多个基础能力,以下对各个主要能力介绍。

数据库

云开发提供了一个 JSON 数据库,顾名思义,数据库中的每条记录都是一个 JSON 格式的对象。一个数据库可以有多个集合(相当于关系型数据中的表),集合可看做一个 JSON 数组,数组中的每个对象就是一条记录,记录的格式是 JSON 对象。

关系型数据库和 JSON 数据库的概念对应关系如下表:

关系型文档型
数据库 database 数据库 database
表 table 集合 collection
行 row 记录 record / doc
列 column 字段 field

以下是一个示例的集合数据,假设我们有一个 books 集合存放了图书记录,其中有两本书:

[
  {
    "_id": "Wzh76lk5_O_dt0vO",
    "title": "The Catcher in the Rye",
    "author": "J. D. Salinger",
    "characters": [
      "Holden Caulfield",
      "Stradlater",
      "Mr. Antolini"
    ],
    "publishInfo": {
      "year": 1951,
      "country": "United States"
    }
  },
  {
    "_id": "Wzia0lk5_O_dt0vR",
    "_openid": "ohl4L0Rnhq7vmmbT_DaNQa4ePaz0",
    "title": "The Lady of the Camellias",
    "author": "Alexandre Dumas fils",
    "characters": [
      "Marguerite Gautier",
      "Armand Duval",
      "Prudence",
      "Count de Varville"
    ],
    "publishInfo": {
      "year": 1848,
      "country": "France"
    }
  }
]

在图书信息中,我们用 title, author 来记录图书标题和作者,用 characters 数组来记录书中的主要人物,用 publishInfo 来记录图书的出版信息。在其中我们可以看到,字段既可以是字符串或数字,还可以是对象或数组,就是一个 JSON 对象。

每条记录都有一个 _id 字段用以唯一标志一条记录、一个 _openid 字段用以标志记录的创建者,即小程序的用户。需要特别注意的是,在管理端(控制台和云函数)中创建的不会有 _openid 字段,因为这是属于管理员创建的记录。开发者可以自定义 _id,但不可自定义和修改 _openid 。_openid 是在文档创建时由系统根据小程序用户默认创建的,开发者可使用其来标识和定位文档。

数据库 API 分为小程序端和服务端两部分,小程序端 API 拥有严格的调用权限控制,开发者可在小程序内直接调用 API 进行非敏感数据的操作。对于有更高安全要求的数据,可在云函数内通过服务端 API 进行操作。云函数的环境是与客户端完全隔离的,在云函数上可以私密且安全的操作数据库。

数据库 API 包含增删改查的能力,使用 API 操作数据库只需三步:获取数据库引用、构造查询/更新条件、发出请求。以下是一个在小程序中查询数据库的发表于美国的图书记录的例子:

// 1. 获取数据库引用
const db = wx.cloud.database()
// 2. 构造查询语句
// collection 方法获取一个集合的引用
// where 方法传入一个对象,数据库返回集合中字段等于指定值的 JSON 文档。API 也支持高级的查询条件(比如大于、小于、in 等),具体见文档查看支持列表
// get 方法会触发网络请求,往数据库取数据
db.collection('books').where({
  publishInfo: {
    country: 'United States'
  }
}).get({
  success: function(res) {
  // 输出 [{ "title": "The Catcher in the Rye", ... }]
  console.log(res)
 }
})

更多的数据库的 API 的使用和数据库管理,可以参考数据库指引章节。

存储

云开发提供了一块存储空间,提供了上传文件到云端、带权限管理的云端下载能力,开发者可以在小程序端和云函数端通过 API 使用云存储功能。

在小程序端可以分别调用 wx.cloud.uploadFile 和 wx.cloud.downloadFile 完成上传和下载云文件操作。下面简单的几行代码,即可实现在小程序内让用户选择一张图片,然后上传到云端管理的功能:

// 让用户选择一张图片
wx.chooseImage({
  success: chooseResult => {
    // 将图片上传至云存储空间
    wx.cloud.uploadFile({
      // 指定上传到的云路径
      cloudPath: 'my-photo.png',
      // 指定要上传的文件的小程序临时文件路径
      filePath: chooseResult.tempFilePaths[0],
      // 成功回调
      success: res => {
        console.log('上传成功', res)
      },
    })
  },
})

上传完成后可在控制台中看到刚上传的图片。

更多的存储 API 和管理,可以参考存储指引章节。

云函数

云函数是一段运行在云端的代码,无需管理服务器,在开发工具内编写、一键上传部署即可运行后端代码。

小程序内提供了专门用于云函数调用的 API。开发者可以在云函数内使用 wx-server-sdk 提供的 getWXContext 方法获取到每次调用的上下文(appid、openid 等),无需维护复杂的鉴权机制,即可获取天然可信任的用户登录态(openid)。

比如我们如下定义一个云函数,命名为 add ,功能是将传入的两个参数 a 和 b 相加:

// index.js 是入口文件,云函数被调用时会执行该文件导出的 main 方法
// event 包含了调用端(小程序端)调用该函数时传过来的参数,同时还包含了可以通过 getWXContext 方法获取的用户登录态 `openId` 和小程序 `appId` 信息
const cloud = require('wx-server-sdk')
exports.main = (event, context) => {
  let { userInfo, a, b} = event
  let { OPENID, APPID } = cloud.getWXContext() // 这里获取到的 openId 和 appId 是可信的
  let sum = a + b

  return {
    OPENID,
    APPID,
    sum
  }
}

在开发者工具中上传部署云函数后,我们在小程序中可以这么调用:

除了部署云函数进行调用外,我们还支持云函数本地调试,可以不用部署云函数即可测试
wx.cloud.callFunction({
  // 需调用的云函数名
  name: 'add',
  // 传给云函数的参数
  data: {
    a: 12,
    b: 19,
  },
  // 成功回调
  complete: console.log
})
// 当然 promise 方式也是支持的
wx.cloud.callFunction({
  name: 'add',
  data: {
    a: 12,
    b: 19
  }
}).then(console.log)

如需在云函数中操作数据库、管理云文件、调用其他云函数等操作,可使用官方提供的 npm 包 wx-server-sdk 进行操作。

更多的云函数管理和 API,可以参考云函数指引章节。

云调用

云调用是云开发提供的基于云函数使用小程序开放接口的能力,支持在云函数调用服务端开放接口,如发送模板消息、获取小程序码等操作都可以在云函数中完成,详情可见具体开发指引。

HTTP API

云开发资源也可以通过 HTTP 接口访问,即在小程序外访问,接口见HTTP API 文档。

通过这个章节,我们已经了解了云开发是什么,提供了哪些能力,能做什么,接下来跟着我们一起进入开发指引的章节,看看如何上手开发吧!

微信小程序云开发 重要概念

 

重要概念

在此提供云开发的一些重要概念解释,掌握这些概念对理解云开发和其开发模式非常重要:

1.资源环境

一个环境对应一整套独立的云开发资源,包括数据库、存储空间、云函数等资源。各个环境是相互独立的,用户开通云开发后即创建了一个环境,默认可拥有最多两个环境。在实际开发中,建议每一个正式环境都搭配一个测试环境,所有功能先在测试环境测试完毕后再上到正式环境。以初始可创建的两个环境为例,建议一个创建为 test 测试环境,一个创建为 release 正式环境。

为了方便开发者调试,从开发者工具 1.02.1905302 及基础库 2.7.1 起,在 wx.cloud.init 后会在调试器中输出 SDK 中所使用的默认环境:

devtools-network-cloud-init

同时,在 Network 面板中会输出各个云开发操作的请求详情,其中包括该调用所请求的环境 ID:

devtools-network-env

 

2.配额说明

资源配额

以下为云开发各类资源配额指标,由腾讯云 TCB 提供存储和计算服务。 用户可通过下载最新的微信开发者工具使用该功能。 资源配额可分为三类:资源均衡型、CDN 资源消耗型、云函数资源消耗型、数据库资源消耗型。

资源均衡型

分类参数基础版 1基础版 2专业版 1专业版 2专业版 3旗舰版 1旗舰版 2旗舰版 3企业版 1
存储 容量 5GB 10GB 50GB 100GB 300GB 500GB 700GB 1000GB 1300GB
  下载操作次数 150万/月 200万/月 750万/月 1500万/月 2500万/月 3750万/月 4500万/月 5000万/月 6000万/月
  上传操作次数 60万/月 100万/月 300万/月 600万/月 1000万/月 1500万/月 2000万/月 2500万/月 3000万/月
  CDN回源流量1 5GB/月 10GB/月 50GB/月 150GB/月 300GB/月 500GB/月 600GB/月 800GB/月 1000GB/月
CDN CDN流量 5GB/月 25GB/月 50GB/月 150GB/月 300GB/月 500GB/月 1000GB/月 2000GB/月 4000GB/月
云函数 资源使用量GBs3 4万/月 20万/月 40万/月 150万/月 300万/月 400万/月 1500万/月 3000万/月 4000万/月
  外网出流量 1GB/月 3GB/月 5GB/月 10GB/月 20GB/月 25GB/月 100GB/月 200GB/月 400GB/月
数据库 容量 2GB 3GB 5GB 10GB 20GB 10GB 50GB 100GB 200GB
  同时连接数4 20 50 100 200 300 400 500 500 500
  读操作数 5万/天 25万/天 50万/天 150万/天 300万/天 500万/天 1000万/天 2000万/天 5000万/天
  写操作数 3万/天 15万/天 30万/天 100万/天 200万/天 300万/天 500万/天 1000万/天 3000万/天
  集合限制 100个 150个 200个 300个 400个 400个 500个 600个 800个
总价   免费 30 元/月 104 元/月 390 元/月 690 元/月 860 元/月 2,499 元/月 4,699 元/月 8,999 元/月

CDN 资源消耗型

分类参数CDN 版 1CDN 版 2CDN 版 3
存储 容量 50GB 100GB 500GB
  下载操作次 750万/月 1500万/月 3750万/月
  上传操作次数 300万/月 600万/月 1500万/月
  CDN回源流量 50GB/月 150GB/月 500GB/月
CDN CDN流量 500GB/月 3072GB/月 10240GB/月
云函数 资源使用量GBs 20万/月 50万/月 150万/月
  外网出流量 3GB/月 5GB/月 10GB/月
数据库 容量 3GB 5GB 10GB
  同时连接数 50 100 200
  读操作数 25万/天 50万/天 150万/天
  写操作数 15万/天 30万/天 100万/天
  集合限制 150个 200个 300个
总价   149 元/月 690 元/月 2,199 元/月

云函数资源消耗型

分类参数云函数版 1云函数版 2云函数版 3
存储 容量 5GB 10GB 50GB
  下载操作次数 150万/月 200万/月 750 万/月
  上传操作次数 60万/月 100 万/月 300万/月
  CDN回源流量 5GB/月 10GB/月 50GB/月
CDN CDN流量 5GB/月 25GB/月 150GB/月
云函数 资源使用量GBs 40万/月 400万/月 1500万/月
  外网出流量 5GB/月 25GB/月 100GB/月
数据库 容量 3GB 10GB 20GB
  同时连接数 50 200 300
  读操作数 25万/天 150万/天 300万/天
  写操作数 15万/天 100万/天 200万/天
  集合限制 150个 300个 400个
总价   79 元/月 390 元/月 1,299 元/月

数据库资源消耗型

分类参数数据库版 1数据库版 2数据库版 3
存储 容量 5GB 10GB 50GB
  下载操作次数 150万/月 200万/月 750 万/月
  上传操作次数 60万/月 100 万/月 300万/月
  CDN回源流量 5GB/月 10GB/月 50GB/月
CDN CDN流量 5GB/月 25GB/月 50GB/月
云函数 资源使用量GBs 20万/月 150万/月 400万/月
  外网出流量 3GB/月 10GB/月 25GB/月
数据库 容量 5GB 50GB 200GB
  同时连接数 100 400 500
  读操作数 50万/天 500万/天 5000万/天
  写操作数 30万/天 300万/天 3000万/天
  集合限制 200个 400个 800个
总价   69 元/月 590 元/月 1,799 元/月

除以上配额参数外,小程序·云开发资源还包括以下系统参数限制(所有版本配额都遵守相同的系统参数限制):

  • 云函数(单次运行)运行内存:256M5
  • 云函数数量:50个
  • 云函数并发数:10006
  • 数据库流量:单次出包大小为16M
  • 数据库单集合索引限制:20个
  • 单个小程序的小程序端请求频率限制:100 万次/分钟

注:

  1. CDN回源流量:指开启了 CDN 加速后,CDN 回源存储时产生的流量。
  2. 云函数调用次数:已放开调用次数限制,现所有套餐均改为无限调用次数
  3. 云函数资源使用量 GBs:资源使用量 = 函数配置内存 X 运行计费时长。用户资源使用量,是由函数配置内存,乘以函数运行时的计费时长得出,其中配置内存转换为 GB 单位,计费时长由毫秒(ms)转换为秒(s)单位,因此,资源使用量的计算单位为 GBs(GB-秒)。例如,配置为 256MB 的函数,单次运行了 1760 ms,计费时长为 1800 ms,则单次运行的资源使用量为 (256/1024)*(1800/1000) = 0.45 GBs。针对函数的每次运行,均会计算资源使用量,并按月汇总求和,作为当月的资源使用量。
  4. 数据库同时连接数 :数据库请求并发数量,如同时有三十个数据库操作请求,则有二十个会同时执行,剩下十个返回超出并发错误;一次数据库请求(无论小程序端发起还是云函数端发起)将耗费一个连接;每个云环境分别有一个同时连接数限制、独立计数。假如数据库查询平均耗时 10ms,那么一个连接可以支持 100qps(1000ms/10ms=100),20个连接可以支持到 2000qps。
  5. 云函数(单次运行)运行内存:云函数运行时最大可用内存为 256 MB。在云函数运行日志中展示的运行内存信息,为当次运行时的实际使用内存。实际使用内存可能低于最大可用内存,计费时按配置内存即 256 MB 计算。
  6. 云函数同时连接数:已放开同时连接数限制,现所有套餐均改为统一的最大上限 1000

服务等级协议

小程序·云开发由腾讯云 TCB 提供存储和计算服务,因此小程序·云开发遵循《腾讯云云开发服务等级协议(SLA)》中的相关规定。

对于已购买云开发套餐并已产生费用的客户,如服务可用性低于标准,开发者有权根据服务等级协议中的赔偿方案,通过相应账户的 工单 申请赔付。具体可用性计算规则、赔偿标准和申请方式遵循《腾讯云云开发服务等级协议(SLA)》中的规定。

特别说明

  • 自付费功能上线起,将不再受理通过邮箱申请的小程序·云开发配额调整申请。
  • 对于截止2019-06-21日前申请调整的配额的截止日期统一延长至2019-08-31。

微信小程序云开发 多端支持

多端支持

云开发除了支持小程序端 SDK、云函数端 SDK 访问外,从 06/04 起支持 Web 端 SDK 访问。

Web SDK

Web SDK 在 Web 中使用,可以访问云开发资源,目前仅支持未登录模式访问,在 web 中暂不支持获取登录态。

API 异同

Web SDK API 与小程序端 API 基本一样,主要有以下不同点:

cloud.init

cloud.init 增加参数 appid,调用时必须传入小程序 appid,如:

cloud.init({
  appid: 'wx123456789',
  env: 'release-xxx',
})

uploadFile

小程序端是传入临时文件地址作为上传的源文件,web 端要求传入 file 参数,类型为 File。

downloadFile

小程序端是将下载的文件存为本地临时文件,web 端是将内容以 arraybuffer 形式在字段 data 中返回。

文档

API 文档都在 SDK API 文档中,支持 Web 端使用的 API 都有标注。

更新日志

未登录模式使用注意事项

  1. 出于安全考虑,云环境默认不支持未登录下访问,需首先在 ”云开发控制台 - 设置 - 全局设置“ 中开启(需开发者工具 1.03.2006042 或以上)
  2. 未登录模式必须搭配安全规则使用,若数据库、存储的权限设置为简易权限配置而不是安全规则配置,未登录用户将无法访问云资源
  3. 在未登录模式访问时,安全规则的 auth 变量将为空,可以以此判断未登录请求

CDN 地址列表

微信小程序云开发 开发指引

2020-07-24 15:32 更新

开发指引

云开发提供了一整套云服务及简单、易用的 API 和管理界面,以尽可能降低后端开发成本,让开发者能够专注于核心业务逻辑的开发、尽可能轻松的完成后端的操作和管理。

下面我们将分一下部分介绍如何上手使用云能力:

微信小程序云开发控制台

云开发控制台

云开发提供了一个控制台用于可视化管理云资源。控制台包含以下几大模块。

  • 概览:查看云资源的总体使用情况
  • 用户管理:查看小程序的用户访问记录
  • 数据库:管理数据库集合、记录、权限设置、索引设置
  • 存储管理:管理云文件、权限设置
  • 云函数:管理云函数、查看调用日志、监控记录
  • 统计分析:查看云资源详细使用统计

在用户管理中会显示使用云能力的小程序的访问用户列表,默认以访问时间倒叙排列,访问时间的触发点是在小程序端调用 wx.cloud.init 方法,且其中的 traceUser 参数传值为 true。例:

wx.cloud.init({
  traceUser: true
})

微信小程序云开发初始化

初始化

在小程序端开始使用云能力前,需先调用 wx.cloud.init 方法完成云能力初始化(注意小程序需先开通云服务,开通的方法是点击工具栏左上角的 “控制台” 按钮)。因此,如果要使用云能力,通常我们在小程序初始化时即调用这个方法。

wx.cloud.init 方法的定义如下:

function init(options): void

wx.cloud.init 方法接受一个可选的 options 参数,方法没有返回值。

options 参数定义了云开发的默认配置,该配置会作为之后调用其他所有云 API 的默认配置,options 提供的可选配置如下:

字段数据类型必填默认值说明
env string | object default 默认环境配置,传入字符串形式的环境 ID 可以指定所有服务的默认环境,传入对象可以分别指定各个服务的默认环境,见下方详细定义
traceUser boolean false 是否在将用户访问记录到用户管理中,在控制台中可见

当 env 传入参数为对象时,可以指定各个服务的默认环境,可选字段如下:

字段数据类型必填默认值说明
database string default 数据库 API 默认环境配置
storage string default 存储 API 默认环境配置
functions string default 云函数 API 默认环境配置

示例代码:

wx.cloud.init({
  env: 'test-x1dzi'
})

云函数端初始化

cloud.init 方法的定义如下:

function init(options): void

cloud.init 方法接受一个可选的 options 参数,方法没有返回值。方法只能调用一次,多次调用时只有第一次调用生效。

options 参数定义了云开发的默认配置,该配置会作为之后调用其他所有云 API 的默认配置,options 提供的可选配置如下:

字段数据类型必填默认值说明
env string | object   后续 API 调用的默认环境配置,传入字符串形式的环境 ID 或传入 cloud.DYNAMIC_CURRENT_ENV 可以指定所有服务的默认环境,传入对象可以分别指定各个服务的默认环境,见下方详细定义

当 env 传入参数为对象时,可以指定各个服务的默认环境,可选字段如下:

字段数据类型必填默认值说明
database string default 数据库 API 默认环境配置
storage string default 存储 API 默认环境配置
functions string default 云函数 API 默认环境配置
default string 缺省时 API 默认环境配置

注意:env 设置只会决定本次云函数 API 调用的云环境,并不会决定接下来其他被调云函数中的 API 调用的环境,在其他被调云函数中需要通过 init 方法重新设置环境。

建议:在设置 env 时指定 cloud.DYNAMIC_CURRENT_ENV 常量 (需 SDK v1.1.0 或以上) ,这样云函数内发起数据库请求、存储请求或调用其他云函数的时候,默认请求的云环境就是云函数当前所在的环境:

const cloud = require('wx-server-sdk')
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})

exports.main = async (event) => {
  const { ENV, OPENID, APPID } = cloud.getWXContext()

  // 如果云函数所在环境为 abc,则下面的调用就会请求到 abc 环境的数据库
  const dbResult = await cloud.database().collection('test').get()

  return {
    dbResult,
    ENV,
    OPENID,
    APPID,
  }
}
注:上述代码中的 env 参数的值不能用 cloud.getWXContext().ENV 替代,因为在 exports.main 外部调用的 getWXContext() 无法获取到当前环境

API 风格

云开发的 API 风格与框架组件和 API 风格一致,但同时支持回调风格和Promise风格。在传入 API 的 Object 参数中,如果传入了 success、fail、complete 字段,则我们认为是采用回调风格,API 方法调用不返回 Promise。如果传入 API 的 Object 参数中 success、fail、complete 这三个字段都不存在,则我们认为是采用Promise风格,API 方法调用返回一个 Promise,Promise resolve 的结果同传入 success 回调的参数,reject 的结果同传入 fail 的参数。

注意事项

  • 如果 init 时不传 env 参数,后续 API 调用将默认请求到第一个创建的环境,但这种方式并不总是预期的,因此这种方式已废弃,请务必明确传入 env 参数

微信小程序云开发数据库

如在云开发数据库的基础介绍中所说,云开发提供了一个 JSON 数据库,本章将介绍以下内容:

  • 上手:用控制台创建我的第一个集合,插入我的第一条数据
  • 数据类型:了解数据库提供的数据类型
  • 权限控制:控制集合与记录的读写权限
  • 初始化:初始化数据库 API
  • 插入数据
  • 读取数据:读取数据
  • 构建查询条件:构建简单或复杂的查询条件
  • 更新数据:数据的局部更新与替换更新
  • 删除数据
  • 索引管理:为字段添加索引实现高效读写

另外可参考小程序端和云函数端的数据库 API 文档


上手云数据库

这一节我们将介绍如何在控制台中创建我们的第一个数据库集合、往集合上插入数据、以及在控制台中查看刚刚插入的数据。

创建第一个集合

打开控制台,选择 "数据库" 标签页,通过 "添加集合" 入口创建一个集合。假设我们要创建一个待办事项小程序,我们创建一个名为 todos 的集合。创建成功后,可以看到 todos 集合管理界面,界面中我们可以添加记录、查找记录、管理索引和管理权限。

数据库

创建第一条记录

控制台提供了可视化添加数据的交互界面,点击 "添加记录" 添加我们的第一条待办事项:

{
  // 描述,String 类型
  "description": "learn mini-program cloud service",
  // 截止时间,Date 类型
  "due": Date("2018-09-01"),
  // 标签,Array 类型
  "tags": [
    "tech",
    "mini-program",
    "cloud"
  ],
  // 个性化样式,Object 类型
  "style": {
    "color": "red"
  },
  // 是否已完成,Boolean 类型
  "done": false
}

添加完成后可在控制台中查看到刚添加的数据。

导入数据

云控制台支持上传文件导入已有的数据,可查看导入指引了解如何操作。

接下来,我们一起了解下数据库都提供了哪些数据类型。


数据类型

云开发数据库提供以下几种数据类型:

  • String:字符串
  • Number:数字
  • Object:对象
  • Array:数组
  • Bool:布尔值
  • GeoPoint:地理位置点
  • Date:时间
  • Null

下面对几个需要额外说明的字段做下补充说明。

Date

Date 类型用于表示时间,精确到毫秒,在小程序端可用 JavaScript 内置 Date 对象创建。需要特别注意的是,在小程序端创建的时间是客户端时间,不是服务端时间,这意味着在小程序端的时间与服务端时间不一定吻合,如果需要使用服务端时间,应该用 API 中提供的 serverDate 对象来创建一个服务端当前时间的标记,当使用了 serverDate 对象的请求抵达服务端处理时,该字段会被转换成服务端当前的时间,更棒的是,我们在构造 serverDate 对象时还可通过传入一个有 offset 字段的对象来标记一个与当前服务端时间偏移 offset 毫秒的时间,这样我们就可以达到比如如下效果:指定一个字段为服务端时间往后一个小时。

那么当我们需要使用客户端时间时,存放 Date 对象和存放毫秒数是否是一样的效果呢?不是的,我们的数据库有针对日期类型的优化,建议大家使用时都用 Date 或 serverDate 构造时间对象。

GeoPoint

GeoPoint 类型用于表示地理位置点,用经纬度唯一标记一个点,这是一个特殊的数据存储类型。注意,如果需要对类型为地理位置的字段进行查找,一定要建立地理位置索引。

具体的地理位置 API 可参考 Geo API 文档

Null

null 相当于一个占位符,表示一个字段存在但是值为空。


权限控制

数据库的权限分为小程序端和管理端,管理端包括云函数端和控制台。小程序端运行在小程序中,读写数据库受权限控制限制,管理端运行在云函数上,拥有所有读写数据库的权限。云控制台的权限同管理端,拥有所有权限。小程序端操作数据库应有严格的安全规则限制。

初期我们对操作数据库开放以下几种权限配置,每个集合可以拥有一种权限配置,权限配置的规则是作用在集合的每个记录上的。出于易用性和安全性的考虑,云开发为云数据库做了小程序深度整合,在小程序中创建的每个数据库记录都会带有该记录创建者(即小程序用户)的信息,以 _openid 字段保存用户的 openid 在每个相应用户创建的记录中。因此,权限控制也相应围绕着一个用户是否应该拥有权限操作其他用户创建的数据展开。

以下按照权限级别从宽到紧排列如下:

  • 仅创建者可写,所有人可读:数据只有创建者可写、所有人可读;比如文章。
  • 仅创建者可读写:数据只有创建者可读写,其他用户不可读写;比如用私密相册。
  • 仅管理端可写,所有人可读:该数据只有管理端可写,所有人可读;如商品信息。
  • 仅管理端可读写:该数据只有管理端可读写;如后台用的不暴露的数据。

简而言之,管理端始终拥有读写所有数据的权限,小程序端始终不能写他人创建的数据,小程序端的记录的读写权限其实分为了 “所有人可读,只有创建者可写“、”仅创建者可读写“、”所有人可读,仅管理端可写“、”所有人不可读,仅管理端可读写“。

对一个用户来说,不同模式在小程序端和管理端的权限表现如下:

模式小程序端
读自己创建的数据
小程序端
写自己创建的数据
小程序端
读他人创建的数据
小程序端
写他人创建的数据
管理端
读写任意数据
仅创建者可写,所有人可读 ×
仅创建者可读写 × ×
仅管理端可写,所有人可读 × ×
仅管理端可读写:该数据只有管理端可读写 × × × ×

在设置集合权限时应谨慎设置,防止出现越权操作。


初始化

在开始使用数据库 API 进行增删改查操作之前,需要先获取数据库的引用。以下调用获取默认环境的数据库的引用:

const db = wx.cloud.database()

如需获取其他环境的数据库引用,可以在调用时传入一个对象参数,在其中通过 env 字段指定要使用的环境。此时方法会返回一个对测试环境数据库的引用。

示例:假设有一个环境名为 test,用做测试环境,那么可以如下获取测试环境数据库:

const testDB = wx.cloud.database({
  env: 'test'
})

要操作一个集合,需先获取它的引用。在获取了数据库的引用后,就可以通过数据库引用上的 collection 方法获取一个集合的引用了,比如获取待办事项清单集合:

const todos = db.collection('todos')

获取集合的引用并不会发起网络请求取拉取它的数据,我们可以通过此引用在该集合上进行增删查改的操作,除此之外,还可以通过集合上的 doc 方法来获取集合中一个指定 ID 的记录的引用。同理,记录的引用可以用于对特定记录进行更新和删除操作。

假设我们有一个待办事项的 ID 为 todo-identifiant-aleatoire,那么我们可以通过 doc 方法获取它的引用:

const todo = db.collection('todos').doc('todo-identifiant-aleatoire')

接下来,我们看看如何往集合中插入数据。


插入数据

可以通过在集合对象上调用 add 方法往集合中插入一条记录。还是用待办事项清单的例子,比如我们想新增一个待办事项:

db.collection('todos').add({
  // data 字段表示需新增的 JSON 数据
  data: {
    // _id: 'todo-identifiant-aleatoire', // 可选自定义 _id,在此处场景下用数据库自动分配的就可以了
    description: "learn cloud database",
    due: new Date("2018-09-01"),
    tags: [
      "cloud",
      "database"
    ],
    // 为待办事项添加一个地理位置(113°E,23°N)
    location: new db.Geo.Point(113, 23),
    done: false
  },
  success: function(res) {
    // res 是一个对象,其中有 _id 字段标记刚创建的记录的 id
    console.log(res)
  }
})

当然,Promise 风格也是支持的,只要传入对象中没有 success, fail 或 complete,那么 add 方法就会返回一个 Promise:

db.collection('todos').add({
  // data 字段表示需新增的 JSON 数据
  data: {
    description: "learn cloud database",
    due: new Date("2018-09-01"),
    tags: [
      "cloud",
      "database"
    ],
    location: new db.Geo.Point(113, 23),
    done: false
  }
})
.then(res => {
  console.log(res)
})

数据库的增删查改 API 都同时支持回调风格和 Promise 风格调用。

在创建成功之后,我们可以在控制台中查看到刚新增的数据。

可以在 add API 文档中查阅完整的 API 定义。

接下来,我们将学习如何使用 API 查询到刚插入的数据。

微信小程序云开发存储

微信小程序云开发存储

2020-07-28 15:23 更新

云存储提供高可用、高稳定、强安全的云端存储服务,支持任意数量和形式的非结构化数据存储,如视频和图片,并在控制台进行可视化管理。云存储包含以下功能:

  • 存储管理:支持文件夹,方便文件归类。支持文件的上传、删除、移动、下载、搜索等,并可以查看文件的详情信息
  • 权限设置:可以灵活设置哪些用户是否可以读写该文件夹中的文件,以保证业务的数据安全
  • 上传管理:在这里可以查看文件上传历史、进度及状态
  • 文件搜索:支持文件前缀名称及子目录文件的搜索
  • 组件支持:支持在 image、audio 等组件中传入云文件 ID

接下来,我们看看云文件管理提供了哪些 API、及如何在控制台中管理云文件:

  • 存储 API
  • 控制台中管理文件

API 指引

上传文件

在小程序端可调用 wx.cloud.uploadFile 方法进行上传:

wx.cloud.uploadFile({
  cloudPath: 'example.png', // 上传至云端的路径
  filePath: '', // 小程序临时文件路径
  success: res => {
    // 返回文件 ID
    console.log(res.fileID)
  },
  fail: console.error
})

上传成功后会获得文件唯一标识符,即文件 ID,后续操作都基于文件 ID 而不是 URL。

下载文件

可以根据文件 ID 下载文件,用户仅可下载其有访问权限的文件:

wx.cloud.downloadFile({
  fileID: '', // 文件 ID
  success: res => {
    // 返回临时文件路径
    console.log(res.tempFilePath)
  },
  fail: console.error
})

删除文件

可以通过 wx.cloud.deleteFile 删除文件:

wx.cloud.deleteFile({
  fileList: ['a7xzcb'],
  success: res => {
    // handle success
    console.log(res.fileList)
  },
  fail: console.error
})

更详细的 API 可参考小程序端及后端存储 API 文件。

组件支持

支持在 image、audio 等组件中传入云文件 ID,具体支持列表见文档

换取临时链接

可以根据文件 ID 换取临时文件网络链接,文件链接有有效期为两个小时:

wx.cloud.getTempFileURL({
  fileList: ['cloud://xxx.png'],
  success: res => {
    // fileList 是一个有如下结构的对象数组
    // [{
    //    fileID: 'cloud://xxx.png', // 文件 ID
    //    tempFileURL: '', // 临时文件网络链接
    //    maxAge: 120 * 60 * 1000, // 有效期
    // }]
    console.log(res.fileList)
  },
  fail: console.error
})

API 文档

可以在此参考详细的小程序端存储 API 文档和服务端 API 文档


管理文件

在控制台中,选择存储管理标签页,可以在此看到云存储空间中所有的文件,还可以查看文件的详细信息、控制存储空间的读写权限。

 


文件名命名限制

  • 不能为空
  • 不能以/开头
  • 不能出现连续/
  • 编码长度最大为850个字节
  • 推荐使用大小写英文字母、数字,即[a-z,A-Z,0-9]和符号 -,!,_,.,* 及其组合
  • 不支持 ASCII 控制字符中的字符上(↑),字符下(↓),字符右(→),字符左(←),分别对应 CAN(24),EM(25),SUB(26),ESC(27)
  • 如果用户上传的文件或文件夹的名字带有中文,在访问和请求这个文件或文件夹时,中文部分将按照 URL Encode 规则转化为百分号编码。
  • 不建议使用的特殊字符: ` ^ " \ { } [ ] ~ % # \ > < 及 ASCII 128-255 十进制
  • 可能需特殊处理后再使用的特殊字符: , : ; = & $ @ + ?(空格)及ASCII 字符范围:00-1F 十六进制(0-31 十进制)以及7F(127 十进制)

组件支持

小程序组件支持传入云文件 ID,支持列表如下:

组件属性
image src
video src、poster
cover-image src
接口参数
getBackgroundAudioManager src
createInnerAudioContext src
previewImage urls、current

微信小程序云开发云函数

微信小程序云开发云函数

2020-07-24 15:49 更新

云函数即在云端(服务器端)运行的函数。在物理设计上,一个云函数可由多个文件组成,占用一定量的 CPU 内存等计算资源;各云函数完全独立;可分别部署在不同的地区。开发者无需购买、搭建服务器,只需编写函数代码并部署到云端即可在小程序端调用,同时云函数之间也可互相调用。

一个云函数的写法与一个在本地定义的 JavaScript 方法无异,代码运行在云端 Node.js 中。当云函数被小程序端调用时,定义的代码会被放在 Node.js 运行环境中执行。我们可以如在 Node.js 环境中使用 JavaScript 一样在云函数中进行网络请求等操作,而且我们还可以通过云函数后端 SDK 搭配使用多种服务,比如使用云函数 SDK 中提供的数据库和存储 API 进行数据库和存储的操作,这部分可参考数据库和 存储后端 API 文档。

云开发的云函数的独特优势在于与微信登录鉴权的无缝整合。当小程序端调用云函数时,云函数的传入参数中会被注入小程序端用户的 openid,开发者无需校验 openid 的正确性因为微信已经完成了这部分鉴权,开发者可以直接使用该 openid。

接下来,我们将逐步学习以下内容:

  • 我的第一个云函数
  • 获取小程序用户信息
  • 异步返回结果
  • 使用 wx-server-sdk
  • 在开发者工具中管理云函数
  • 测试、日志与监控
  • 注意事项

我的第一个云函数

我们以定义一个将两个数字相加的函数作为我们第一个云函数的示例。

在项目根目录找到 project.config.json 文件,新增 cloudfunctionRoot 字段,指定本地已存在的目录作为云函数的本地根目录

示例:

{
   "cloudfunctionRoot": "./functions/"
}

project.config.json 的其他配置,详见项目配置文件

完成指定之后,云函数的根目录的图标会变成 “云目录图标”,云函数根目录下的第一级目录(云函数目录)是与云函数名字相同的,如果对应的线上环境存在该云函数,则我们会用一个特殊的 “云图标” 标明

接着,我们在云函数根目录上右键,在右键菜单中,可以选择创建一个新的 Node.js 云函数,我们将该云函数命名为 add。开发者工具在本地创建出云函数目录和入口 index.js 文件,同时在线上环境中创建出对应的云函数。创建成功后,工具会提示是否立即本地安装依赖,确定后工具会自动安装 wx-server-sdk。我们可以看到类似如下的一个云函数模板:

const cloud = require('wx-server-sdk')
// 云函数入口函数
exports.main = async (event, context) => {

}

云函数的传入参数有两个,一个是 event 对象,一个是 context 对象。event 指的是触发云函数的事件,当小程序端调用云函数时,event 就是小程序端调用云函数时传入的参数,外加后端自动注入的小程序用户的 openid 和小程序的 appid。context 对象包含了此处调用的调用信息和运行状态,可以用它来了解服务运行的情况。在模板中也默认 require 了 wx-server-sdk,这是一个帮助我们在云函数中操作数据库、存储以及调用其他云函数的微信提供的库,关于 wx-server-sdk 的使用我们在另一个章节讲述。

我们填充一下模板:

exports.main = async (event, context) => {
  return {
    sum: event.a + event.b
  }
}

本段代码的意思是将传入的 a 和 b 相加并作为 sum 字段返回给调用端。

在小程序中调用这个云函数前,我们还需要先将该云函数部署到云端。在云函数目录上右键,在右键菜单中,我们可以将云函数整体打包上传并部署到线上环境中。

部署完成后,我们可以在小程序中调用该云函数:

wx.cloud.callFunction({
  // 云函数名称
  name: 'add',
  // 传给云函数的参数
  data: {
    a: 1,
    b: 2,
  },
  success: function(res) {
    console.log(res.result) // 3
  },
  fail: console.error
})

当然,Promise 风格的调用也是支持的:

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

那么到这里,我们就成功创建了我们的第一个云函数,并在小程序中成功调用!

接下来,我们介绍云函数和小程序登录态如何无缝结合,以及如何在云函数端获取小程序用户信息(openid 和 appid)。

微信小程序云开发 云调用

云调用

版本要求:wx-server-sdk >= 0.4.0、开发者工具 >= 1.02.1904090 (RC版下载)

云调用是云开发提供的基于云函数使用小程序开放接口的能力,目前覆盖以下使用场景:

  • 服务端调用
  • 开放数据调用
  • 消息推送

一、服务端调用

云调用需要在云函数中通过 wx-server-sdk 使用。在云函数中使用云调用调用服务端接口无需换取 access_token,只要是在从小程序端触发的云函数中发起的云调用都经过微信自动鉴权,可以在登记权限后直接调用如发送模板消息等开放接口。使用方式如下:

1. 查看服务端接口是否支持云调用

在服务端接口列表中罗列了所有的服务端接口,如果接口支持云调用,则在接口名称旁会带有 云调用 的标签。同时,在每一个服务端接口文档中,如果接口支持云调用,也会有专门的支持说明以及相应的使用文档。

2. 查看接口的云调用文档

在支持云调用的接口文档中,会分别列出 HTTPS 调用的文档及云调用的文档,云调用文档同 HTTPS 调用文档一样包含请求参数、返回值及示例。

3. 为云函数声明所需调用的接口

接着,需要配置云调用权限,每个云函数需要声明其会使用到的接口,否则无法调用,声明的方法是在云函数目录下的 config.json(如无需新建)配置文件的 permissions.openapi 字段中增加要调用的接口名,permissions.openapi 是个字符串数组字段,值必须为所需调用的服务端接口名称。在每次使用微信开发者工具上传云函数时均会根据配置更新权限,该配置有10分钟的缓存,如果更新后提示没有权限,稍等10分钟后再试。以下是一个示例的声明了使用发送模板消息接口的配置文件:

{
  "permissions": {
    "openapi": [
      "templateMessage.send"
    ]
  }
}

4. 在云函数中使用云调用

首先云函数中需要使用版本号至少 0.4.0 的 wx-server-sdk,建议 wx-server-sdk 始终保持最新,保证云函数目录下的 package.json 的 wx-server-sdk 字段为 latest,如本地安装依赖,请执行 npm install --save wx-server-sdk@latest。

接下来,可在云函数中使用云调用 API 了。云调用 API 均挂载在 wx-server-sdk 模块的 openapi 对象下,各个开放接口类别在 openapi 对象下设二级命名空间对象(如模板消息接口的方法均在 openapi.templateMessage 下),该对象下挂载该类别下的所有开放方法(比如模板消息的发送接口是 openapi.templateMessage.send)。各接口从属的类别名称和方法名称可以通过接口名称查看,接口名称均以 <类别>.<方法> 命名,如发送模板消息的接口名称是 templateMessage.send。下面是一个给自己发送模板消息的示例:

如需可直接运行的示例,请在 IDE 中创建一个云开发快速启动模板的项目,其中有包含发送模板消息的云调用的示例
const cloud = require('wx-server-sdk')
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})
exports.main = async (event, context) => {
  try {
    const result = await cloud.openapi.templateMessage.send({
      touser: cloud.getWXContext().OPENID, // 通过 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
  } catch (err) {
    // 错误处理
    // err.errCode !== 0
    throw err
  }
}

二、开放数据调用

对返回敏感开放数据的小程序端接口,从基础库 2.7.0 起,如果小程序已开通云开发,则可在开放数据接口的返回值中获取到唯一对应敏感开放数据的 cloudID,通过云调用可以直接获取到开放数据,具体使用方法见 云调用直接获取开放数据。

三、消息推送

云开发也支持通过云函数接收小程序消息推送(如接收到客服消息时触发云函数),具体接入方式见消息推送。

微信小程序云开发 微信支付

微信小程序云开发 告警

2020-07-24 15:54 更新

告警

目前小程序·云开发提供两种告警配置:

  • 基础告警:包括资源使用量提醒和计费相关信息,告警规则由系统配置,开发者可修改对应的告警渠道。
  • 自定义告警:由开发者自定义告警条件。

告警群配置

开发者可以通过登录 微信开发者工具,在 云开发控制台 的 设置 页面中的 告警设置 中使用该功能。目前加入告警群的方式包括:

  • 通过扫描二维码加入。
  • 在告警群中邀请相关人员加入。

移除群成员的方式包括:

  • 告警群中的用户主动退出告警群。
  • 小程序的开发者在 云开发控制台 中的 设置 页面中的 告警设置 中移除相关人员。

自定义告警

开发者可通过登录 微信开发者工具,在 云开发控制台 的 设置 页面中的 自定义告警 中配置告警策略。每个环境最多可配置 50 条告警策略,每个告警策略中最多可添加 10 个告警条件。

每条告警策略需录入信息包括:

  • 告警策略名称
  • 环境 ID
  • 资源类型:目前仅支持对云函数配置自定义告警
  • 告警对象:每条告警规则至少需要选择一个告警对象
  • 告警条件:告警指标:目前仅支持云函数错误次数和云函数运行时间统计周期:目前的统计周期仅支持 5 分钟统计一次比较方式:目前提供的比较方式包括 >、>=、<、<=、= 以及 !=持续周期:目前支持的持续周期包括持续 1 个周期、持续 2 个周期、持续 3 个周期、持续 4 个周期以及持续 5 个周期告警频率:目前支持的告警频率包括每小时告警一次和每 12 个小时告警一次
  • 告警渠道:目前自定义告警仅支持通过群告警下发消息

自定义告警设置

基础告警

基础告警包括:

  • 资源使用提醒
  • 计费相关提醒

基础告警为系统默认设置告警规则,开发者暂时无法修改相关告警规则,但可通过 告警渠道配置 设置接收告警的方式。详细的告警规则可参考 告警规则。

告警渠道配置

目前系统提供两种消息推送渠道,用于推送基础告警:

  • 通过 微信公众平台 公众号推送告警消息至小程序的相关人员
  • 推送告警消息至 小程序云监控告警群 中

默认情况下,系统同时开启这两种告警渠道。

开发者可以通过登录 微信开发者工具,在 云开发控制台 的 设置 页面中的 告警设置 中使用该功能。默认情况下,系统会同时开启 公告号告警 和 群告警 两种渠道。如需调整,可点击 设置 进行修改。

告警设置

告警规则

现有的告警规则包括:

情形描述告警规则公众号告警人群
资源使用提醒 存储容量 80% 套餐量,90% 套餐量 小程序所有开发者
资源使用提醒 存储下载调用次数 80% 套餐量,90% 套餐量 小程序所有开发者
资源使用提醒 存储上传调用次数 80% 套餐量,90% 套餐量 小程序所有开发者
资源使用提醒 CDN 回源流量 80% 套餐量,90% 套餐量 小程序所有开发者
资源使用提醒 CDN 流量 80% 套餐量,90% 套餐量 小程序所有开发者
资源使用提醒 云函数调用次数 80% 套餐量,90% 套餐量 小程序所有开发者
资源使用提醒 云函数资源使用量 80% 套餐量,90% 套餐量 小程序所有开发者
资源使用提醒 数据库容量 80% 套餐量,90% 套餐量 小程序所有开发者
资源使用提醒 数据库读取次数 80% 套餐量,90% 套餐量 小程序所有开发者
资源使用提醒 数据库写入次数 80% 套餐量,90% 套餐量 小程序所有开发者
计费相关提醒 新购发货成功通知 新购发货成功后 下单者和小程序管理员
计费相关提醒 资源到期通知 资源到期前 7 天开始推送 小程序所有开发者
计费相关提醒 续费成功通知 续费成功后 下单者和小程序管理员
计费相关提醒 资源停服通知 资源停服后 小程序所有开发者
计费相关提醒 资源释放通知 资源释放后 小程序所有开发者
计费相关提醒 套餐变更成功通知 升配或降配成功后 下单者和小程序管理员
计费相关提醒 资源超限停服通知 资源超限停服后 小程序所有开发者

微信小程序云开发 数据库API

微信小程序云开发 数据库API

2018-11-12 14:48 更新

小程序·云开发提供了丰富的数据库操作 API,此处是数据库小程序端的 API 参考文档。

数据库 API 都是懒执行的,这意味着只有真实需要网络请求的 API 调用才会发起网络请求,其余如获取数据库、集合、记录的引用、在集合上构造查询条件等都是不会触发网络请求的。触发网络请求的 API 有如下几个:

API说明
get 获取集合 / 记录数据
add 在集合上新增记录
update 更新集合 / 记录数据
set 替换更新一个记录
remove 删除记录
count 统计查询语句对应的记录条数

获取引用的 API 有如下几个:

API说明
database 获取数据库引用,返回 Database 对象
collection 获取集合引用,返回 Collection 对象
doc 获取对一个记录的引用,返回 Document 对象

在数据库 (Database) 对象上有如下字段:

字段说明
command 获取数据库查询及更新指令,返回 Command
serverDate 构造服务端时间
Geo 获取地理位置操作对象,返回 Geo 对象

在集合 (Collection) 对象上有如下 API:

API说明
doc 获取对一个记录的引用,返回 Document 对象
add 在集合上新增记录
where 构建一个在当前集合上的查询条件,返回 Query,查询条件中可使用查询指令
orderBy 指定查询数据的排序方式
limit 指定返回数据的数量上限
skip 指定查询时从命中的记录列表中的第几项之后开始返回
field 指定返回结果中每条记录应包含的字段

在记录 (Document) 对象上有如下 API:

API说明
get 获取记录数据
update 局部更新数据
set 替换更新记录
remove 删除记录
field 指定返回结果中记录应包含的字段

Command (db.command) 对象上有如下查询指令:

API说明
eq 字段是否等于指定值
neq 字段是否不等于指定值
lt 字段是否小于指定值
lte 字段是否小于或等于指定值
gt 字段是否大于指定值
gte 字段是否大于或等于指定值
in 字段值是否在指定数组中
nin 字段值是否不在指定数组中
and 条件与,表示需同时满足另一个条件
or 条件或,表示如果满足另一个条件也匹配

Command (db.command) 对象上有如下更新指令:

API说明
set 设置字段为指定值
remove 删除字段
inc 原子自增字段值
mul 原子自乘字段值
push 如字段值为数组,往数组尾部增加指定值
pop 如字段值为数组,从数组尾部删除一个元素
shift 如字段值为数组,从数组头部删除一个元素
unshift 如字段值为数组,往数组头部增加指定值

 

微信小程序云开发API 获取集合数据

2018-11-08 11:25 更新

Collection.get / Query.get

获取集合数据,或获取根据查询条件筛选后的集合数据。

如果没有指定 limit,则默认最多取 20 条记录。

如果没有指定 skip,则默认从第 0 条记录开始取,skip 常用于分页,例子可见本节的第二个示例代码。

函数签名如下:

function get(options?: object): Promise<Result>

参数说明

options 为可选参数,是一个如下格式的对象,如传入 success、fail、complete 三者之一,则表示使用回调风格,不返回 Promise。

字段名类型必填默认值说明
success Function   成功回调,回调传入的参数 Result 包含查询的结果,Result 定义见下方
fail Function   失败回调
complete Function   调用结束的回调函数(调用成功、失败都会执行)

返回值说明

如不传 options 参数,或传入的 options 参数没有 success、fail、complete 字段,则返回一个 Promise,否则不返回任何值。Promise的 resolve 和 reject 的结果定义如下:

 结果说明
resolve 查询的结果,Result 定义见下方
reject 失败原因

Result 说明

success 回调的结果及 Promise resolve 的结果 Result 是一个如下结构的对象:

字段类型说明
data Array 查询的结果数组,数据的每个元素是一个 Object,代表一条记录

示例代码 1

获取我的待办事项清单

回调风格

const db = wx.cloud.database()
db.collection('todos').where({
  _openid: 'xxx' // 填入当前用户 openid
}).get({
  success: function(res) {
    console.log(res.data)
  }
})

Promise 风格

const db = wx.cloud.database()
db.collection('todos').where({
  _openid: 'xxx' // 填入当前用户 openid
}).get().then(res => {
  console.log(res.data)
})

示例代码 2:分页取数据

获取我的第二页的待办事项清单,假设一页 10 条,现在要取第 2 页,则可以指定 skip 10 条记录

// Promise 风格
const db = wx.cloud.database()
db.collection('todos')
  .where({
    _openid: 'xxx', // 填入当前用户 openid
  })
  .skip(10) // 跳过结果集中的前 10 条,从第 11 条开始返回
  .limit(10) // 限制返回数量为 10 条
  .get()
  .then(res => {
    console.log(res.data)
  })
  .catch(err => {
    console.error(err)
  })

微信小程序云开发服务端存储API 将本地资源上传至云存储空间

uploadFile

将本地资源上传至云存储空间,如果上传至同一路径则是覆盖。

请求参数

字段说明数据类型默认值必填
cloudPath 云存储路径 String - Y
fileContent 要上传文件的内容 fs.ReadStream - Y

Promise返回结果说明

字段说明数据类型
fileID 文件 ID String
statusCode 服务器返回的 HTTP 状态码 Number

错误返回参数

字段说明数据类型
errCode 错误码 Number
errMsg 错误信息,格式 apiName:fail msg String

使用示例

Promise 风格

const cloud = require('wx-server-sdk')
const fs = require('fs')
const path = require('path')

exports.main = async (event, context) => {
  const fileStream = fs.createReadStream(path.join(__dirname, 'demo.jpg'))
  return await cloud.uploadFile({
    cloudPath: 'demo.jpg',
    fileContent: fileStream,
  })
}

微信小程序云开发服务端存储API 从云存储空间下载文件

downloadFile

从云存储空间下载文件

请求参数

字段说明数据类型默认值必填
fileID 云文件 ID String - Y

Promise 返回参数

字段说明数据类型
fileContent 文件内容 Buffer
statusCode 服务器返回的 HTTP 状态码 Number

错误返回参数

字段说明数据类型
errCode 错误码 Number
errMsg 错误信息,格式 apiName:fail msg String

使用示例

Promise 风格

const cloud = require('wx-server-sdk')

exports.main = async (event, context) => {
  const fileID = 'xxxx'
  const res = await cloud.downloadFile({
    fileID: fileID,
  })
  const buffer = res.fileContent
  return buffer.toString('utf8')
}

 

 

 

 

 

 

posted @ 2022-03-27 21:44  hanease  阅读(267)  评论(0编辑  收藏  举报