Skip to content

云开发(CloudBase)

介绍

云开发是一个基于云资源的一体化开发平台,开发者只需编写业务逻辑代码,无需管理服务器等基础设施,即可在云端运行和扩展应用。

换算成中文就是: 基于云的(不需要单独服务器), 核心包含数据库、存储、函数、托管的(后端功能封装), 一体化后端服务。

通过JavaScript操作数据库, 存储, 函数, 托管。

国外很火,国内使用人比较少(观念问题)。

其特点包括:
  • ‌无运维负担‌:免去服务器搭建和运维,后端资源由云服务商弹性调度‌。
  • ‌开发效率高‌:支持客户端直接操作数据库和文件存储,降低前后端协作成本。
  • ‌按需付费‌:资源使用量按需计费,避免传统模式下的硬件闲置浪费。
  • ‌扩展性强‌:可快速集成AI、大数据等扩展能力,满足复杂业务需求。

总结下来就是: 1、便宜; 2、高并发

国内云平台
  • 腾讯云, 与微信生态深度整合,适合小程序开发;提供云函数、实时数据库等特色功能‌。
  • 微信云, 微信团队联合腾讯云推出的专业的小程序开发服务, 更简单。(限制微信环境)
  • UniCloud云开发, 与uniapp深度整合。
  • 阿里云
选择方式
  • 价格
  • 易用
  • 扩展性 (开发接口,多平台支持)
  • 稳定性 (口碑 + 使用人数)

Q & A

作为一个后端服务,云开发首先要解决的基础功能是包括:

  • 1 数据库
    • 1.1 云开发用的什么数据库?
    • 1.2 可不可以使用第三方数据库
  • 2 接口
    • 2.1 如何写接口
    • 2.2 如何调用接口
    • 2.3 如何鉴权
    • 2.4 接口如何调用数据库
    • 2.5 如何调用第三方接口
  • 3 云存储
    • 3.1 如何上传文件
    • 3.2 如何下载文件
    • 3.3 如何对文件进行操作
  • 4 部署
    • 4.1 如何部署
    • 4.2 如何进行测试
    • 4.3 如何进行监控

用一篇文章来写整个后端开发流程,想想就头大。但是,云开发就是这么简单。

下面 微信云开发 示例

微信云开发文档

1 数据库

1.1 云开发用的什么数据库?

可选 文档型(NoSQL)、MySQL型、和链接自有MySQL数据库

数据库管理地址

1.2 可不可以使用第三方数据库

可以

2 接口

2.1 如何写接口

逻辑代码和接口,在这边叫做云函数

如果在微信开发者工具中,使用模版创建微信云开发小程序, 就会在根目录下生成 cloudfunctions 文件夹, 里面就是 node.js 云函数

cloudfunctions
├── hello1
│   ├── index.js
│   ├── package.json
│   └── yarn.lock
└── hello2
    ├── index.js
    ├── package.json
    └── yarn.lock

hello/index.js 是云函数的入口文件, cloudfunctions 根目录下每个子目录都是一个云函数。

云函数的入口文件是 index.js,它是一个云函数的集合,每个云函数都有自己的入口文件。

index.js 文件示例
js
// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()

/**
 * 云函数入口函数
 * @param {Object} event - event 指的是触发云函数的事件,当小程序端调用云函数时,event 就是小程序端调用云函数时传入的参数,外加后端自动注入的小程序用户的 openid 和小程序的 appid
 * @param {Object} context - context 对象包含了此处调用的调用信息和运行状态,可以用它来了解服务运行的情况
 */
exports.main = async (event, context) => {

  return {
    sum: event.a + event.b
  }
}

2.1 如何调用接口

小程序环境调用
  • 方式1: 直接调用云函数
js
wx.cloud.callFunction({
  // 云函数名称, 就是 cloudfunctions 文件夹下的文件夹名
  name: 'hello1',
  // 传给云函数的参数
  data: {
    a: 1,
    b: 2,
  },
  success: function(res) {
    console.log(res.result.sum) // 3
  },
  fail: console.error
})
  • 方式2,Promise 风格
js
wx.cloud.callFunction({
  // 云函数名称
  name: 'add',
  // 传给云函数的参数
  data: {
    a: 1,
    b: 2,
  },
})
.then(res => {
  console.log(res.result) // 3
})
.catch(console.error)

2.3 如何鉴权

微信云开发,免鉴权

每次调用云函数,都会携带 openidappid,用于辨别用户身份。

js
const cloud = require('wx-server-sdk')
cloud.init()
// 获取 openid、appid 和 UnionID
const { OPENID, APPID, UNIONID }  = cloud.getWXContext()

2.4 接口如何调用数据库

详见文档

云数据库可以在云函数 或者 小程序 调用,

初始化
js
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()

const db = cloud.database() // 默认操作默认环境数据库
// 如需指定环境(如测试环境)
// const db = cloud.database({ env: 'your-env-id' })
js
// 向集合 todos 中添加数据
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
  }
})
.then(res => {
   // res 是一个对象,其中有 _id 字段标记刚创建的记录的 id
    console.log(res)
})
  • 单条查询
js
// 查询 todos 集合中 id 为 todo-identifiant-aleatoire 的记录
db.collection('todos').doc('todo-identifiant-aleatoire').get().then(res => {
  // res.data 包含该记录的数据
  console.log(res.data)
})
  • 多条查询
js
// 查询 todos 集合中所有记录
db.collection('todos').get().then(res => {
  // res.data 包含该记录的数据
  console.log(res.data)
})
  • 条件查询
js
// 查询 todos 集合 done 字段 = false 的记录
db.collection('todos').where({
  done: false
})  
.get().then(res => {
  // res.data 包含该记录的数据
  console.log(res.data)
})
js
// 更新 todos 集合中 id 为 todo-identifiant-aleatoire 的记录
db.collection('todos').doc('todo-identifiant-aleatoire').update({
  // data 传入需要局部更新的数据
  data: {
    // 表示将 done 字段置为 true
    done: true
  }
})  
.then(res => {
  console.log(res)    
})
  • 删除单条记录
js
// 删除 todos 集合中 id 为 todo-identifiant-aleatoire 的记录
db.collection('todos').doc('todo-identifiant-aleatoire').remove({
  success: function(res) {
    console.log(res.data)
  }
})
批量删除
js
// 删除 todos 集合中 id 为 todo-identifiant-aleatoire 的记录
db.collection('todos').where({
  done: true
})  
.remove() 
.then(res => {
  console.log(res)
})

2.5 如何调用第三方接口

安装第三方请求库(如 axios 或 request-promise)‌

js
// call_api/index.js
const cloud = require('wx-server-sdk')
const rp = require('request-promise')
cloud.init()

exports.main = async (event) => {
  const { url, params } = event
  try {
    const result = await rp({
      uri: url,
      qs: params,
      json: true
    })
    return { code: 200, data: result }
  } catch (err) {
    return { code: 500, msg: '接口调用失败' }
  }
}

3 云存储

3.1 如何上传文件

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

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

3.2 如何下载文件

  • 组件使用 支持在 image、audio 等组件中传入云文件 ID 约等于 URL 地址,即可自动下载文件并展示。

  • 换取临时链接

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

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

3.3 如何对文件进行操作

  • 可以通过 wx.cloud.deleteFile 删除文件:
js
wx.cloud.deleteFile({
  fileList: ['cloud://xxx.png'],
  success: res => {
    // fileList 是一个有如下结构的对象数组
    // [{
    //    fileID: 'cloud://xxx.png', // 文件 ID
    //    status: 'success', // 状态
    // }]
    console.log(res.fileList)
  },
  fail: console.error 
})

4 部署

4.1 如何部署

在云函数目录上右键,在右键菜单中,我们可以将云函数整体打包上传并部署到线上环境中

4.2 如何进行测试

在正式的开发中,建议先在本地调试云函数通过后,再上传部署云函数进行正式测试,以保证线上发布的稳定性。使用本地调试的方法是:

  • 编写如上云函数代码
  • 对云函数目录右键,选择 “启动云函数本地调试”
  • 此时应该看到本地调试窗口打开,同时该云函数的 tab 也已打开,如果没有,在左侧列表中选择该函数,双击打开 tab
  • 如果右侧的控制面板中的 “开启本地调试” 没有勾选,勾选上,勾选后会开启对该云函数的本地调试,所有模拟器中的请求会请求到本地调试的云函数实例
  • 在小程序模拟器中操作,发起对该云函数的调用
  • 此时云函数本地实例被触发,可以进行断点等调试操作

4.3 如何进行监控

后台提供可视化监控功能,用于监控云函数的调用情况、错误情况等。

总结

以上是微信云开发的基本使用,详细的使用方法可以参考官方文档。

云开发还支持在微信公众号调用。

京ICP备2024093538号-1