uniCloud
是 DCloud 联合阿里云、腾讯云、支付宝云,为开发者提供的基于 serverless 模式和 js 编程的云开发平台。
普通云函数
callFuction方式云函数,也称之为普通云函数
uni-app的前端代码,不再执行uni.request联网,而是通过uniCloud.callFunction调用云函数。
callFunction方式避免了服务器提供域名,不暴露固定ip,减少被攻击的风险
uniCloud.callFunction
该方法需要一个json对象作为参数,其中包含两个字段
// promise方式
uniCloud.callFunction({name: 'hellocf',data: { a: 1 }}).then(res => {});// callback方式
uniCloud.callFunction({name: 'hellocf',data: { a: 1 },success(){},fail(){},complete(){}
});
云函数的入参
客户端callFunction调用云函数时,云函数通过入参接收客户端数据,通过头信息上下文获取客户端信息,经过业务逻辑处理后给客户端返回结果
// 客户端调用云函数并传递参数
uniCloud.callFunction({name: 'hellocf',data: {a:1,b:2}}).then(res => {});
// hellocf云函数index.js入口文件代码
'use strict';
exports.main = async (event, context) => {//event为客户端上传的参数let c = event.a + event.breturn {sum: c} // 通过return返回结果给客户端
}
云函数的传入参数有两个,一个是event对象,一个是context对象。
- event指的是触发云函数的事件,当客户端调用云函数时,event就是客户端调用云函数时传入的参数
- context对象包含了本次请求的上下文,包括客户端的ip,ua,appId等信息,以及云函数的环境情况,调用来源source等信息
event对象
vent对象,可以理解为客户端上行参数中的json对象。在使用uni-id
且登录成功后,会自动多添加了一个uniIdToken
属性。
可以通过 event.uniIdToken
获取 uni-id 的 token,如下:
'use strict';
exports.main = async (event, context) => {let token = event.uniIdToken // 客户端uni-id token
}
context对象
context对象的属性清单如下:
云数据库
uniCloud提供了一个JSON格式的文档型数据库,顾名思义,数据库中的每一条记录都是一个JSON格式的文档,他是nosql非关系型数据库
创建空表
云函数通过传统方式操作数据库
获取集合的引用
‘use strict’
const db=uniCloud.database();//连接数据库
// 获取对`user`集合的引用
exports.main = async (event, context){// let res = await db.collection('users').get();// let res=await db.collection("users").count()let res=await db.collection("users").add({ // 单次插入name:'小红',gender:'女'})let res=await db.collection("users").add([{},{}])return res;
}
最后所return的东西就会被前端所接收到,从而渲染到页面上
集合Collection
添加小案例
提交数据的时候要整成对象提交
doc操作可获得某id的详细信息,db.collection("users").doc("id").get()
db.command指令
'use strict';
const db=uniCloud.database()
const dbCmd = db.command;
exports.main = async (event, context) => {//event为客户端上传的参数// console.log('event : ', event)// let res=await db.collection('users').limit(5).skip(5).get()// 获取5个数据,过滤掉前5条数据,从第六条数据开始获取(skip())// let res=await db.collection('users').orderBy('_id','desc').get()// desc为倒序获取,asc为正序(默认)// let res=await db.collection('users').field({"name":true}).get()// 指定需要哪些字段,不可混用,只能明确说明用和不用let res = await db.collection('users').where({// age:dbCmd.eq(30)//等同于相等,查询数据库中年龄为30的数据age:dbCmd.gt(20).and(dbCmd.lt(40)) //大于20并且小于40age:dbCmd.and(gt(20),dbCmd.lt(40)) //大于20并且小于40age:dbCmd.or(lt(20),dbCmd.gt(40)) //大于40或者小于20})//返回数据给客户端return event
};
正则表达式查询
根据正则表达式进行筛选
'use strict';
const db=uniCloud.database()
const dbCmd = db.command;
exports.main = async (event, context) => {let {keyword} = eventlet res = await db.collection('users').where({name:new RegExp(keyword,"ig")})//返回数据给客户端return event
};
update更新数据库
'use strict';
const db = uniCloud.database()
const dbCmd = db.command;
exports.main = async (event, context) => {//event为客户端上传的参数let res=await db.collection('users').where({_id:dbCmd.in(['id1','id2'])//批量进行修改}).update({// mail:'mail'tabs:{job:'歌手'}})//返回数据给客户端return event
};
给数组追加数据
使用command指令的方法,unshift,push,pop,shift
从第二个位置开始插入
给push里面传一个对象,包含插入的内容和要从哪里开始插入的索引
inc指令
更新指令,用于指示字段自增某个值,这是个原子操作,使用这个操作指令而不是先读数据,再加,再写回的好处是:
- 原子性:多个用户同时写,对数据库来说都是将字段加一,不会有后来者覆写前者的情况
- 减少一次请求:不需先读再写
'use strict';
const db = uniCloud.database()
const dbCmd = db.command;
exports.main = async (event, context) => {//event为客户端上传的参数let res=await db.collection('users').where({_id:dbCmd.in('id1')//批量进行修改}).update({// mail:'mail'// tabs:{// job:'歌手'// }like:dbCmd.unshift(['篮球','演习']) //向前追加like:dbCmd.push(['打游戏']) //向前追加like:dbCmd.pop() // 删除末尾like:dbCmd.shift() // 删除开头love:dbCmd.inc(3)// 给该字段增加3like:dbCmd.push({each:["aaa","bbb"],position:1//从索引为1的地方开始插入})})//返回数据给客户端return event
};
set
覆写记录,会删除操作的记录中的所有字段,创建传入的字段,如果操作的记录不存在,会自动创建新的记录
set和update的区别:
set是直接覆盖原有的数据,而update只是修改传进去的字段的值
删除文档
通过指定文档ID删除: collection.doc(_id).remove()(单次删除)
批量删除使用where(使用command指令)
const db=uniCloud.database();
const dbCmd=db.command;
exports.main=async (event,context)=> {return await db.collection("users").where({// name:'王五'_id:dbCmd.neq(-1) //删除数据库中所有数据}).remove()
}
删除文档中某个或者某些特殊的字段:通过$unset利用update将要删除的字段包裹起来,调用云函数或者本地运行云函数即可