Appearance
云开发(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.lockhello/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 如何鉴权
微信云开发,免鉴权
每次调用云函数,都会携带 openid 和 appid,用于辨别用户身份。
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 如何进行监控
后台提供可视化监控功能,用于监控云函数的调用情况、错误情况等。
总结
以上是微信云开发的基本使用,详细的使用方法可以参考官方文档。
云开发还支持在微信公众号调用。