微信小程序开发【十】-- 云函数/云数据库/云存储

系列文章目录

微信小程序开发【一】-- 初识小程序 传送门
微信小程序开发【二】-- 小程序入门 传送门
微信小程序开发【三】-- 项目结构概述 传送门
微信小程序开发【四】-- 配置详解 传送门
微信小程序开发【五】-- wxml详解 传送门
微信小程序开发【六】-- wxss详解 传送门
微信小程序开发【七】-- js详解 传送门
微信小程序开发【八】-- 页面栈和模块化 传送门
微信小程序开发【九】-- 初识小程序云开发 传送门
微信小程序开发【十】-- 云函数/云数据库/云存储 传送门



一、初始化

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

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

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

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

二、云函数

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

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

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

wx-server-sdk
wx-server-sdk
package.json
  • 云函数的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,
  }
}
  • 部署到云端的函数可以在小程序中调用云函数
wx.cloud.callFunction({
    
    
  // 云函数名称
  name: 'add',
  // 传给云函数的参数
  data: {
    
    
    a: 1,
    b: 2,
  },
  success(res) {
    
    
    console.log(res.result.sum) // 3
  },
  fail: console.error
})

三、云数据库

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

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

关系型 文档型
数据库 database 数据库 database
表 table 集合 collection
行 row 记录 record / doc
列 column 字段 field
  • 在开始使用数据库 API 进行增删改查操作之前,需要先获取数据库的引用。以下调用获取默认环境的数据库的引用:
const db = wx.cloud.database()
  • 要操作一个集合,需先获取它的引用。在获取了数据库的引用后,就可以通过数据库引用上的 collection 方法获取一个集合的引用了,比如获取待办事项清单集合:
const todos = db.collection('todos')
  • 我们可以通过此引用在该集合上进行增删查改的操作,除此之外,还可以通过集合上的 doc 方法来获取集合中一个指定 ID 的记录的引用。同理,记录的引用可以用于对特定记录进行更新和删除操作。假设我们有一个待办事项的 ID 为 todo-identifiant-aleatoire,那么我们可以通过 doc 方法获取它的引用:
const todo = db.collection('todos').doc('todo-identifiant-aleatoire')

1. 插入数据

  • 可以通过在集合对象上调用 add 方法往集合中插入一条记录。还是用待办事项清单的例子,比如我们想新增一个待办事项:
db.collection('todos').add({
    
    
  // data 字段表示需新增的 JSON 数据
  data: {
    
    
    // _id: 'todo-identifiant-aleatoire', // 可选自定义 _id,在此处场景下用数据库自动分配的就可以了
    description: 'learn cloud database',
    due: new Date('2023-04-21'),
    tags: [
      'cloud',
      'database'
    ],
    // 为待办事项添加一个地理位置(113°E,23°N)
    location: new db.Geo.Point(113, 23),
    done: false
  },
  success(res) {
    
    
    // res 是一个对象,其中有 _id 字段标记刚创建的记录的 id
    console.log(res)
  }
})

2. 读取数据

  • 在记录和集合上都有提供 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 方法即可只返回满足指定查询条件的记录

3. 更新数据

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

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)
  }
})

4. 删除数据

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

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

四、云存储

云开发提供了一块存储空间,提供了上传文件到云端、带权限管理的云端下载能力,开发者可以在小程序端和云函数端通过 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)
      },
    })
  },
})

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


总结

  • 代码执行——云函数:在云端运行的代码,微信私有协议天然鉴权,开发者只需编写自身业务逻辑代码。云函数是一段运行在云端的代码,无需管理服务器,在开发工具内编写、一键上传部署即可运行后端代码。
  • 数据库能力——数据库:一个既可在小程序前端操作,也能在云函数中读写的 JSON 数据库
  • 文件存储能力——存储:在小程序前端直接上传/下载云端文件,在云开发控制台可视化管理

猜你喜欢

转载自blog.csdn.net/u011646838/article/details/130302671