微信小程序云开发

 什么是云开发?

云开发是由腾讯云联合微信团队为开发者提供的 包含 云函数、云数据库和云文件存储能力的后端云服务

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

云开发提供了哪些能力?

  • 代码执行——云函数:在云端运行的代码,微信私有协议天然鉴权,开发者只需编写自身业务逻辑代码。云函数是一段运行在云端的代码,无需管理服务器,在开发工具内编写、一键上传部署即可运行后端代码。

  • 数据库能力——数据库:一个既可在小程序前端操作,也能在云函数中读写的 JSON 数据库

  • 文件存储能力——存储:在小程序前端直接上传/下载云端文件,在云开发控制台可视化管理

数据库能力解读:

云开发提供的数据库是一个具备了完整的增删改查能力的JSON数据库,数据库中的每条记录都是json格式

数据库 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(res) {
  // 输出 [{ "title": "The Catcher in the Rye", ... }]
    console.log(res)
  }
})

文件储存能力解读:

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

在小程序端可以分别调用 wx.cloud.uploadFile 和 wx.cloud.downloadFile 完成上传和下载云文件操作。

云函数能力解读:

云函数为用户提供了在云端运行一段代码的能力,开发者无需管理服务器,就可以执行业务逻辑

云函数目前仅支持Node.js环境

云开发控制台

云开发控制台是管理云开发资源的地方,控制台提供以下能力:

  • 概览:查看云开发基础使用数据
  • 用户管理:查看小程序用户信息
  • 数据库:管理数据库,可查看、增加、更新、查找、删除数据、管理索引、管理数据库访问权限等
  • 存储管理:查看和管理存储空间
  • 云函数:查看云函数列表、配置、日志和监控
  • 统计分析:查看云开发资源具体使用统计信息

资源环境

一个环境对应一整套独立的云开发资源,包括数据库、存储空间、云函数等。各个环境间是相互独立的,用户开通云开发后初始默认可拥有最多两个环境。

开发指引

1、初始化

在小程序端开始使用云能力前,需先调用 wx.cloud.init 方法完成云能力初始化

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

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

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

2、数据库

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

const db = wx.cloud.database()

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

const todos = db.collection('todos')

我们可以通过此引用在该集合上进行增删查改的操作,除此之外,还可以通过集合上的 doc 方法来获取集合中一个指定 ID 的记录的引用。同理,记录的引用可以用于对特定记录进行更新和删除操作。

 

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

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

(3)插入数据:可以通过在集合对象上调用 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(res) {
    // res 是一个对象,其中有 _id 字段标记刚创建的记录的 id
    console.log(res)
  }
})

(4)读取数据:在记录和集合上都有提供 get 方法用于获取单个记录或集合中多个记录的数据。

假设我们已有一个 ID 为 todo-identifiant-aleatoire 的在集合 todos 上的记录,那么我们可以通过在该记录的引用调用 get 方法获取这个待办事项的数据:

db.collection('todos').doc('todo-identifiant-aleatoire').get({
  success(res) {
    // res.data 包含该记录的数据
    console.log(res.data)
  }
})

通过调用集合上的 where 方法可以指定查询条件,再调用 get 方法即可只返回满足指定查询条件的记录

(5)更新数据:

更新数据主要有两个方法:

update——局部更新一个或多个记录,即只有指定的字段会更新,其他字段不会受到影响

set——替换更新一个记录,即用传入的对象替换指定的记录

使用 update 方法可以局部更新一个记录或一个集合中的记录,局部更新意味着只有指定的字段会得到更新,其他字段不受影响。

比如我们可以用以下代码将一个待办事项置为已完成:

db.collection('todos').doc('todo-identifiant-aleatoire').update({
  // data 传入需要局部更新的数据
  data: {
    // 表示将 done 字段置为 true
    done: true
  },
  success(res) {
    console.log(res.data)
  }
})

如果需要替换更新一条记录,可以在记录上使用 set 方法,替换更新意味着用传入的对象替换指定的记录

const _ = db.command
db.collection('todos').doc('todo-identifiant-aleatoire').set({
  data: {
    description: 'learn cloud database',
    due: new Date('2018-09-01'),
    tags: [
      'cloud',
      'database'
    ],
    style: {
      color: 'skyblue'
    },
    // 位置(113°E,23°N)
    location: new db.Geo.Point(113, 23),
    done: false
  },
  success(res) {
    console.log(res.data)
  }
})

(6)删除数据:对记录使用 remove 方法可以删除该条记录

对记录使用 remove 方法可以删除该条记录,比如:

db.collection('todos').doc('todo-identifiant-aleatoire').remove({
  success(res) {
    console.log(res.data)
  }
})

注意:批量更新和删除要求必须在云端完成,即,操作必须要写在云函数里

3、云函数

云函数即在云端(服务器端)运行的函数。无需购买、搭建服务器,只需编写函数代码并部署到云端即可在小程序端调用,同时云函数之间也可互相调用。

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

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

示例:

{
  "cloudfunctionRoot": "./functions/"
}
完成指定之后,云函数的根目录的图标会变成 “云目录图标”,云函数根目录下的第一级目录(云函数目录)是与云函数名字相同的,如果对应的线上环境存在该云函数,则我们会用一个特殊的 “云图标” 标明
云函数中使用 wx-server-sdk 需在对应云函数目录下安装 wx-server-sdk 依赖,在创建云函数时会在云函数目录下默认新建一个 package.json 并提示用户是否立即本地安装依赖。

(2)云函数的index.js为入口文件,新创建的云函数,该文件会自动有一个模板

// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()

// 云函数入口函数
exports.main = async (event, context) => {
  const wxContext = cloud.getWXContext()

  return {
    event,
    openid: wxContext.OPENID,
    appid: wxContext.APPID,
    unionid: wxContext.UNIONID,
  }
}

 

(3)部署到云端的函数可以在小程序中调用云函数

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

 小程序延展

1、云开发与serverless

什么是serverless?

  • 无服务器
  • 不需要维护服务器
  • 不管有多少服务器
  • 服务器由服务器提供商来维护
  • 需要使用分布式应用设计来适配serverless架构

云开发是serverless的一种

 

2、服务端API与小程序端API的异同

  • 服务端API仅支持promise风格,小程序端可以使用promise风格和callback回调风格
  • 服务端API可以进行批量的update和remove
  • 云函数能够与微信鉴权进行无缝整合,从小程序端调用云函数时,云函数的第一个参数event会被注入一个userInfo对象,其中含有openId和appId字段

 

posted @ 2019-01-08 09:54  心晴安夏  阅读(1053)  评论(0编辑  收藏  举报