unicloud 开发:
构成:
1, 云函数
2,云数据库: json格式的表
3,云存储和cdn
云函数 运行在云端的函数
1,这个函数是执行在严格环境下的函数(避免使用没有声明的变量)
2, 从数据库差数据需要使用await 来拿到结果
3, 参数 ( event ,context ),event 是客户端传入的参数 , context 包含了 系统调用信息和运行状态
4, 客户端调用云函数 uniCloud.callFunctions(){}
5, 记得改完 上传并部署
1, 客户端调用
uniCloud.callFunction({
name:'holy-test', // 云函数名称
success(res){
console.log(res);
},
fail(e){
console.log(e)
}
})
2, 实际云函数编写
'use strict';
exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('event : ', event)
console.log('context : ', context)
//返回数据给客户端
return {
"data":{"name":'liming',"age":20},
"code":0,
"message":'hi',
}
};
**************************** 使用云函数对数据库进行增删改查
// 获得数据库 引用
const db = uniCloud.database();
// 获取 表的引用
let collection = db.collection('User')
1, 增
let res =await collection.add([
{"name":"vue"},
{"name":"js"}
])
console.log('res : ', JSON.stringify(res))
2, 删
// 查到 id ‘5f4b74af45d03400012d7c31’ 删除
let res =await collection.doc('5f4b74af45d03400012d7c31').remove();
console.log('res : ', JSON.stringify(res))
3, 更新
两种 update 和set
update 只是在原来有的 才能更新, 否则失败
set 如果原来有的数据没有字段 就设置字段, 没有这条的就新增
update
// 查到 id ‘5f4b74af45d03400012d7c31’ update
let res =await collection.doc('5f4b747845d03400012d7b4c').update({
name:'heiheihei'
});
console.log('res : ', JSON.stringify(res))
set 已有 name属性 没有type属性可以更新成功, 如果2个都已经存在了,不会更新成功 ,
// 查到 id ‘5f4b74af45d03400012d7c31’ set
let res =await collection.doc('5f4b747845d03400012d7b4c').set({
name:'hahaha',
type:'vue2'
});
console.log('res : ', JSON.stringify(res))
没有这条的就新增
// 没有 id 123456 set 会新增, 注意此时 id必须为数字
let res =await collection.doc(123456).set({
name:'test',
type:'vue-test'
});
console.log('res : ', JSON.stringify(res))
4,查
(1) doc 查id 再get
//get
let res =await collection.doc('5f4b747845d03400012d7b4c').get();
console.log('res : ', JSON.stringify(res))
(2) where 使用查询条件
//where
let res =await collection.where({'name':'xiaoming'}).get();
console.log('res : ', JSON.stringify(res))
(3) 聚合 更加精细化的搜索
********* ***********************************
如何使用
1, 创建项目时 选择 使用云服务, 需要注册账号 并且实名认证 登陆
2, 去mainfest 基础设置获取应用标识
3, 确保 登录 和应用标识都存在的情况下 , 创建云服务空间 ,填写不重复的名称
4, 链接服务空间
5, 在cloudfunctions 里创建云函数
6 , 右键 上传并运行 ,等于上传部署并且运行 ,可以发现event的打印结果
7,右键 打开webcloud 控制台,可以看到:
(1)云函数 观察用云函数
(2)云数据库 进行数据的操作, 表和字段 ,字段必须是完整的json格式 双引号
(3)云存储 进行文件操作
(4)跨域配置, 只要是h5端调用接口需要, localhost ,127.0.0.1还有dev启动自动生产的ip 做了特殊配置,本地调试无需配置
*******************************************
上传文件
上传图片
<button @click="upload">upload</button>
<image :src='imgs'></image>
data() {
return {
imgs:null
}
},
upload(){
uni.chooseImage({
count:1 ,
success:(res)=>{
// this.uploadToCloud ( res.tempFiles[0]);
console.log(res)
uniCloud.uploadFile({
filePath : res.tempFilePaths[0],
cloudPath: res.tempFiles[0].name,
success:(imgRes)=>{
console.log(imgRes)
if(imgRes.success){
this.imgs = imgRes.fileID
this.uploadToCloud(imgRes.fileID)
}
}
})
},
fail() {
}
})
},
uploadToCloud(fileId){
uniCloud.callFunction({
name:'holy-test',
data:{ imgUrl: fileId},
success(res){
console.log(res);
},
fail(e){
console.log(e)
}
})
},
云端函数
'use strict';
// 获得数据库 引用
const db = uniCloud.database();
exports.main = async (event, context) => {
// 获取 表的引用
let collection = db.collection('user')
//set
let res =await collection.doc('5f4b689145d03400012d4d98').set({
imgUrl: event.imgUrl
});
console.log('res : ', JSON.stringify(res))
console.log(res)
//返回数据给客户端
return {
"data":res,
"code":0,
"message":'success',
}
};
删除图片
<button @click="delImg">删除图片</button>
delImg(){
uniCloud.deleteFile({
fileList:[this.imgs] ,// 数组
success:(res)=>{
this.imgs = res.requestId
console.log(res)
},
fail(e) {
console.log(e)
}
})
}
****************
数据库 初始化可以使用 db_init.json 点击右键选择数据库来进行对数据库初始化操作
*******************
使用配置参数来配置默认传入的参数
// 本文件中的json内容将在云函数【运行】时作为参数传给云函数。
// 配置教程参考:https://uniapp.dcloud.net.cn/uniCloud/quickstart?id=runparam
{
"user_id": "5f4d172f45d034000132d277",
"name": "前端开发"
}
************************
db.command 命令
db.command 我的理解是尽管我们自己写处理函数来得到更新结果, 但是 使用 db.command 命令运算可能会更加接近数据库想要的结果,
const dbCmd = db.command;
let dbFun;
if(article_likes_ids.includes(article_id)){ // 取消收藏
dbFun = dbCmd.pull(article_id) // 这种操作符合数据库的数据结构
}else{
dbFun = dbCmd.addToSet(article_id)
}
await db.collection('user').doc(user_id).update({
article_likes_ids: dbFun // 数据库操作
})
******************************
聚合操作
聚合操作可以进行更加精细定制的接口返回
例如: 1. 添加一个临时字段
.addFields({ // 追加返回字段
is_like:$.in(['$_id',article_likes_ids]) // 接收数组 参数
})
2,分页
.skip(pageSize* (page-1))
.limit(pageSize)
3, 过滤某个字段
.project({ // 类似于field功能
content:false
})
4, 匹配条件成立的
.match(
matchObj // 筛选字段条件成立的
)
// 示例
const db = uniCloud.database();
const $ = db.command.aggregate;
// 聚合
const list = await db.collection('article')
.aggregate() // 聚合关键字
.addFields({ // 追加返回字段
is_like:$.in(['$_id',article_likes_ids]) // 接收数组 参数
})
.match(
matchObj // 筛选字段条件成立的
)
.project({ // 类似于field功能
content:false
})
.skip(pageSize* (page-1))
.limit(pageSize)
.end() // 表示聚合操作完毕, 发起实际聚合操作
最后必须以.end()结尾来发起聚合操作。
***************************
如果返回的字段嵌套太深, 可以采取先拆分再重组的方式来简化
const list = await db.collection("article").aggregate()
.match({
_id:article_id
})
.unwind("$comments") // 拆分
.project({
_id:0,
comments:1
})
.replaceRoot({ // 重组
newRoot:'$comments'
})
.end();
*****************************
自增1 inc操作符号
'use strict';
const db = uniCloud.database();
const dbCmd = db.command;
const $ = dbCmd.aggregate;
exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('event : ', event)
let {user_id, thumb_id} = event;
await db.collection('article').doc(thumb_id).update({
thumbs_up_count: dbCmd.inc(1) // 自增1
})
//返回数据给客户端
return {
code:0,
message:"success",
data:[]
}
};
****************************