云开发核心技术
云开发核心技术
Section titled “云开发核心技术”-
设置 – 环境名称 – 创建环境
- 一个环境对应一整套独立的云开发资源,包括数据库、存储空间、云函数等资源。
- 环境相互独立
- 同常会有两套,生产/开发,同测试服务器和上线服务器
-
- 提供在小程序端直接对数据库进行增删改查的能力; 数据库是类似于MongoDB的文档存储的数据库,操作非常方便;
-
可以在小程序端直接上传、下载、删除文件; 自带CDN,提高文件访问速度; 可以获取临时链接,支持在小程序外访问;
-
提供了在服务器代码的执行能力; 包含微信天然的私有鉴权; 更大权限的操作数据库等; 进行云调用、HTTP请求等操作;
-
在小程序端开始使用云能力前,需先调用
wx.cloud.init方法完成云能力初始化字段 数据类型 必填 默认值 说明 env String|Object 否 默认选中环境 env 参数决定接下来小程序发起的云开发调用(wx.cloud.xxx)
会默认请求到哪个云环境的资源
(相当于要配置使用哪个数据库)traceUser Boolean 否 false 会在 云开发>运营分析>用户访问下可以查看用户的访问量 -
初始化示例,通常在
onLaunch声明周期中确认环境wx.cloud.init({//环境idenv: `cloud1-5gq90yl1e17197f6`,traceUser: true,}); -
可以手动导入数据
注意格式,必须全部是对象格式,不能是集合的格式,对象之间不能有逗号
操作数据和存储方式更像是
Mongodb,Api也很像,用来存放json格式的数据的
-
云数据库
Api和 云函数访问数据的区别,云数据库查询的数据一次最多只能返回
20条,云函数返回100条
条件collection Api
Section titled “条件collection Api”获取集合中指定记录的引用。方法接受一个 id 参数,指定需引用的记录的 _id。
- 通常获取到指定的某一条数据之后,进行
crud操作
过滤 field
Section titled “过滤 field”用来简化查询字段的,相当于mongo中 ,find() 方法的第二个参数,只不过这里是boolean类型,mongo中是 0|1
douyu.where({ hn: /^\d{2}\D/ig }).field({ nickname: true, avatar: true }).get().then(res => console.log(res))进行条件判断,需要搭配查询比较操作符来使用
-
注意:
where调用之后还是要调用get进行查询 -
查询逻辑操作符
Section titled “查询逻辑操作符”也是要通过
command对象获取该指令方法
| fn | 描述 |
|---|---|
and | 并:数组类型,可写多个条件 |
or | 与:数组类型,可写多个条件 |
not | 非:对象类型可搭配其他逻辑指令使用,包括 and, or, nor, not |
nor | 都不:参数数据类型,表示都不匹配的数据 |
-
可以使用正则表达式来进行模糊查询
const cmd = db.commanddouyu.where({nickname: /.周淑怡/ig,progress: cmd.gt(30)}).get().then(res => console.log(res))},
limit 、skip
Section titled “limit 、skip”分页
skip:number类型,作用跳过几条数据limit:number类型,每页显示多个条
douyu.skip(0).limit(8).field({ nickname: true, avatar: true, _id:false }).get().then(res => console.log(res))orderBy
Section titled “orderBy”排序查询
- 可以使用 “点表示法” 连接嵌套字段,比如
style.color表示字段 - 目前是有问题不能排序
command
Section titled “command”对象类型,工具类,包含操作数据库的一些指令函数
-
查询·比较操作函数
Section titled “查询·比较操作函数”
| fn | 描述 |
|---|---|
eq() | 相等 |
neq() | 不相等 |
lt()/lte() | 小于/小于等于 |
gt()/gte() | 大于/大于等于 |
in() | 包含:数组类型 |
nin() | 不包含:数组类型 |
exists() | 筛选某个存在的字段|不存在的字段 |
-
更新数组操作符
Section titled “更新数组操作符”splice 相似,还会有其他方法,具体看文档
- 这些指令函数,用来操作字段为数组的数据
collection.add()- 注意:添加之后会**自动添加
_id和_openid** - 注意:
api的options要在data选项中声明要添加的数据 - _openid 用来记录那个用户修改了或者查看了数据
list.add({ //保存的数据 data: { name: "zhangsan", addr: "天津曲艺协会" }, success: res => console.log(res) })-
update:更新(增加)某一个字段会将输入的字段进行更新,其他字段保持不变
douyu.doc("6842667962ff81da0e709a7b5aac73a7").update({data: {nickname: "lisi"},success: (res) => {console.log(res);}}) -
set: 使用新对象替换原来对象会将整条数据进行替换
douyu.doc("6842667962ff81da0e709a7b5aac73a7").set({data: {name: "zhangsan"},success: (res) => {console.log(res);}})
douyu.doc("6842667962ff81da0e709a7b5aac73a7").remove().then(res => console.log(res))云存储用于将文件存储到云端
- 存放非结构化数据存储,如视频和图片;
- 云存储提供高可用、高稳定、强安全的云端存储服务,可在控制台进行可视化管理
wx.cloud.uploadFile()- 相同的文件不会重复上传
- 参数
cloudPath:必填,云存储保存的文件名和pathfilePath:必填:上传的文件地址
updateFile() {
wx.chooseMedia({ camera: "image", }).then(res => { //上传文件的接口Api wx.cloud.uploadFile({ //必填,云存储保存的文件名和path cloudPath: "image/avatar.jpg", //必填:上传的文件地址 filePath: res.tempFiles[0].tempFilePath //返回fileID:运存储地址 }).then(res => console.log(res.fileID))
}) }默认下载到临时缓存文件中,tmp
- 需要通过
getFileSystemManager,文件管理器saveFile方法 进行保存 wx.saveImageToPhotosAlbum(Object object),也可以将 tempFile 保存到相册
down() { wx.cloud.downloadFile({ fileID: "cloud://cloud1-5gq90yl1e17197f6.636c-cloud1-5gq90yl1e17197f6-1313408770/image/avatar.jpg"
//获取临时文件 }).then(res => { //将临时文件保存到相册 wx.saveImageToPhotosAlbum({ filePath: res.tempFilePath, }).then(res => console.log(res)) }) },-
wx.cloud.deleteFile -
可以批量删除文件
fileListwx.cloud.deleteFile({fileList: ["cloud://cloud1-5gq90yl1e17197f6.636c-cloud1-5gq90yl1e17197f6-1313408770/image/avatar.jpg"]})
获取临时链接
Section titled “获取临时链接”创建的临时链接,可以在小程序意外的地方进行访问
- 有效使用 2 小时 开发指引> 存储> Api
- 返回 https 协议的图片链接,可以进行访问
- 可以设置有效期
maxAge,可以查看文档 - 可以批量获取
fileList,一次最多获取50条
getTempFile() { wx.cloud.getTempFileURL({
fileList: ["cloud://cloud1-5gq90yl1e17197f6.636c-cloud1-5gq90yl1e17197f6-1313408770/image/avatar.jpg"]
}).then(res => console.log(res.fileList[0].tempFileURL)) }
//设置超时事件 wx.cloud.getTempFileURL({ fileList: [{ fileID: 'a7xzcb', maxAge: 60 * 60, // one hour }] }).then(res => { // get temp file URL console.log(res.fileList) }).catch(error => { // handle error })云函数在物理设计上,一个云函数可由多个文件组成,占用一定量的 CPU 内存等计算资源
-
代码运行在云端
Node.js中 -
各云函数完全独立,可分别部署在不同的地区
-
云函数之间也可互相调用
-
云函数的独特优势在于与微信登录鉴权的无缝整合。
Section titled “云函数的独特优势在于与微信登录鉴权的无缝整合。”开发者无需校验 openid 的正确性因为微信已经完成了这部分鉴权,开发者可以直接使用该
openid。
云函数的使用场景
Section titled “云函数的使用场景”-
调用小程序服务端的 Api 接口和获取一些需要鉴权的必要的数据,
消息订阅,数据监听,生成获取openid、生成二维码、…及后台可做的一系列操作
-
通过云函数,来进行服务端的数据整理,
-
普通网络请求在云数据库获取数据的时候最多20条,云函数 get() 方法默认返回 100条,在云函数中进行整理更多的数据,返回逻辑层
- 例如:get 默认返回100条,可以通过
limit(500)返回更多的数据 - 像普通的网络请求使用了 limit(100) 也只会返回20条数据
- 例如:get 默认返回100条,可以通过
云函数的使用
Section titled “云函数的使用”-
云函数是运行在云端的
nodejs当中的,因此需要上传云函数创建的时候,会自动上传,但是修改之后就不会了,注意要手动上传
-
云函数是完全独立的,因此在本地云函数所以依赖
node_modules文件不需要进行上传到云端
云函数文件夹的配置
Section titled “云函数文件夹的配置”project.config.json配置文件中的cloudfunctionRoot字段指定了云函数的根路径miniprogramRoot字段指定了应用逻辑层的根路径
云函数连接到云开发环境
Section titled “云函数连接到云开发环境”-
云函数需要链接到云开发环境,并且初始化环境之后生效
-
注意:要等待提示函数上传成功之后才可以调用
创建云函数之后会自动上传的,上传之后的颜色会变绿
- 但是修改之后便不会立刻上传函数,最好手动上传修改后的云函数
函数调用Api
Section titled “函数调用Api”-
上传成功之后通过
wx.cloud.callFunction接口进行调用会自动调用云函数模块中main方法
-
参数:Object 类型,通过配置参数对象属性进行调用指定的云函数
-
name: 云函数名 -
data: 传入的参数data中的数据会传到云函数的event事件对象当中
-
-
支持
promise和回调函数的方式返回结果 -
在云函数没有
wx的api所以获取cloud对象,要使用wx-server-sdksdk例:
const db = cloud.database()// 通过 wx-server-sdk 来获取cloud 对象const cloud = require('wx-server-sdk')//初始换云环境,使用默认的环境cloud.init()//获取db对象const db = cloud.database()// 云函数入口函数exports.main = async (event, context) => {const wxContext = cloud.getWXContext()console.log(wxContext);//data中的参数console.log(event);//返回的结果return {event,openid: wxContext.OPENID,appid: wxContext.APPID,unionid: wxContext.UNIONID,}}
上传 buffer 图片文件
Section titled “上传 buffer 图片文件”- 在云函数中的
cloud.updateFile({})接口的配置对象属性 - 不是
filePath了 而是fileContent字段,会将图片的缓存 buffer 数据上传的 运存书 - 云开发>开发指引
就是定时任务
- cron表达式
- 云开发> 开发指引> 定时触发器