14.云对象使用JQL语法databaseForJQL
主要区别
特性 | uniCloud.database() (MongoDB) |
uniCloud.databaseForJQL() (JQL) |
---|---|---|
语法 | MongoDB 原生语法 | JQL(类似 GraphQL) |
权限控制 | 需要手动配置 | 默认集成 uni-id 权限系统 |
联合查询 | 需要手动实现 | 支持 getTemp 和联合查询 |
代码量 | 较多(需手动写查询条件) | 较少(链式调用,语法简洁) |
适用场景 | 复杂查询、精细控制 | 快速开发、权限集成、多表查询 |
/uniCloud-alipay/cloudfunctions/demoObj/index.obj.js
const db = uniCloud.database();
const dbJQL = uniCloud.databaseForJQL()
module.exports = {
_before: function() { // 通用预处理器
},
// 不传值时默认size=3
async getUser(size = 3) {
let res = await dbJQL.collection("demo-user")
.limit(size)
.get()
return res;
},
async addUser(params = {}) {
let res = await dbJQL.collection("demo-user").add(params)
return res;
console.log(res);
},
}
/pages/demo4/demo4
<script setup>
import {
ref
} from 'vue';
// 导入云对象
const demoObj = uniCloud.importObject("demoObj");
const dataList = ref([])
// 获取数据
const getData = async () => {
let {
data
} = await demoObj.getUser(7);
dataList.value = data;
console.log(data);
}
// 新增用户
const handleAddUser = async () => {
let res = await demoObj.addUser({
name: "小黑",
age: "22",
gender: 1
});
console.log(res);
}
getData();
</script>
<template>
<view class="">
<button @click="handleAddUser">新增用户</button>
<view class="item" v-for="item in dataList" :key="item._id">
<view>{{item.name}}</view>
<view>{{item.age}}</view>
<view>-------</view>
</view>
</view>
</template>
<style lang="scss" scoped>
</style>
15.JQL不支持的方法可以使用传统云函数解决
const db = uniCloud.database();
const dbJQL = uniCloud.databaseForJQL()
const dbCmd = db.command
module.exports = {
_before: function() { // 通用预处理器
},
// 不传值时默认size=3
async getUser(size = 3) {
let res = await dbJQL.collection("demo-user")
.limit(size)
.get()
return res;
},
async addUser(params = {}) {
let res = await dbJQL.collection("demo-user")
.add(params)
return res;
console.log(res);
},
async updateUser(id = "") {
let res = await dbJQL.collection("demo-user")
.doc(id)
.update({
like: ["唱", "跳", "rap", "篮球"]
})
// let res = await db.collection("demo-user")
// .doc(id)
// .update({
// like: dbCmd.push(["踢足球"]),
// })
console.log(res);
},
}

16.内置特殊方法预处理_before和后处理_after
目前有3个内置特殊方法:_before
、_after
、_timing
预处理 _before
云对象内可以创建一个特殊的方法_before
,用来在调用常规方法之前进行预处理,一般用于拦截器、统一的身份验证、参数校验等。
_before: function() { // 通用预处理器
this.params = {
name: "ABC"
};
this.clientInfo = this.getClientInfo();
// 主动抛出一个错误,中断当前代码的执行,并将错误信息返回给调用方
if (false) {
throw new Error("没有权限");
}
},
后处理 _after
与预处理_before
对应的是后处理_after
。云对象内可以创建一个特殊的方法_after
用来再加工处理本次调用方法的返回结果或者抛出的错误
_after(error, result) {
if (error) {
throw error
}
// 追加
// result.author="ABC"
return result;
},
const db = uniCloud.database();
const dbJQL = uniCloud.databaseForJQL()
const dbCmd = db.command
module.exports = {
_before: function() { // 通用预处理器
// 开始的时间
this.startTime = Date.now()
this.params = {
name: "ABC"
};
this.clientInfo = this.getClientInfo();
// 主动抛出一个错误,中断当前代码的执行,并将错误信息返回给调用方
if (false) {
throw new Error("没有权限");
}
},
// 不传值时默认size=3
async getUser(size = 3) {
let res = await dbJQL.collection("demo-user")
.limit(size)
.get()
return res;
},
async addUser(params = {}) {
let res = await dbJQL.collection("demo-user")
.add(params)
return res;
console.log(res);
},
async updateUser(id = "") {
let res = await dbJQL.collection("demo-user")
.doc(id)
.update({
like: ["唱", "跳", "rap", "篮球"]
})
// let res = await db.collection("demo-user")
// .doc(id)
// .update({
// like: dbCmd.push(["踢足球"]),
// })
console.log(res);
},
async removeUser(id = "") {
let res = await dbJQL.collection("demo-user")
.doc(id)
.remove();
console.log(res);
},
_after(error, result) {
if (error) {
throw error
}
// 追加
// result.author="ABC"
// 查询数据用了多少时间
// result.timeCost = Date.now() - this.startTime
return result;
},
}
17.向数据库增加随机用户信息
const db = uniCloud.database();
const dbJQL = uniCloud.databaseForJQL()
const dbCmd = db.command
module.exports = {
_before: function() { // 通用预处理器
// 开始的时间
this.startTime = Date.now()
this.params = {
name: "ABC"
};
this.clientInfo = this.getClientInfo();
// 主动抛出一个错误,中断当前代码的执行,并将错误信息返回给调用方
if (false) {
throw new Error("没有权限");
}
},
// 不传值时默认size=3
async getUser(size = 3) {
let res = await dbJQL.collection("demo-user")
.limit(size)
.get()
return res;
},
async addUser(params = {}) {
let res = await dbJQL.collection("demo-user")
.add(params)
return res;
console.log(res);
},
async updateUser(id = "") {
let res = await dbJQL.collection("demo-user")
.doc(id)
.update({
like: ["唱", "跳", "rap", "篮球"]
})
// let res = await db.collection("demo-user")
// .doc(id)
// .update({
// like: dbCmd.push(["踢足球"]),
// })
console.log(res);
},
async removeUser(id = "") {
let res = await dbJQL.collection("demo-user")
.doc(id)
.remove();
console.log(res);
},
async demo() {
let username = "匿名" + Math.random().toString(36).substring(3, 9);
let rdmage = Math.floot(Math.random() * (50 - 10 + 1) + 10)+"";
let res = await dbJQL.collection("demo-user")
.add({
name: username,
age: rdmage
});
return res
},
_after(error, result) {
if (error) {
throw error
}
// 追加
result.author = "ABC"
// 查询数据用了多少时间
result.timeCost = Date.now() - this.startTime
return result;
},
}
定时运行 _timing
在 uniCloud web控制台可以配置定时任务。给一个云对象配置后,将定时执行该云对象的内置方法 _timing
cloudfunction-config
其中cloudfunction-config字段是云函数配置,支持的配置如下
{
"concurrency": 10, // 单个云函数实例最大并发量,不配置的情况下默认是1
"memorySize": 512, // 函数的最大可用内存,单位MB,可选值: 128|256|512|1024|2048,默认值256,阿里云正式版默认512
"timeout": 60, // 函数的超时时间,单位秒,默认值5。阿里云最长为120秒,阿里云在定时触发时最长可以是7200秒
// triggers 字段是触发器数组,目前仅支持一个触发器,即数组只能填写一个,不可添加多个
"triggers": [{ // 阿里云腾讯云均为此形式,请阅读下方说明
// name: 触发器的名字,规则见https://uniapp.dcloud.net.cn/uniCloud/trigger,name不对阿里云生效
"name": "myTrigger",
// type: 触发器类型,目前仅支持 timer (即 定时触发器),type不对阿里云生效
"type": "timer",
// config: 触发器配置,在定时触发器下,config 格式为 cron 表达式,规则见https://uniapp.dcloud.net.cn/uniCloud/trigger。使用阿里云时会自动忽略最后一位,即代表年份的一位在阿里云不生效
"config": "0 0 2 1 * * *"
}],
// 云函数Url化path部分
"path": "",
"runtime": "", // nodejs版本,可选Nodejs8、Nodejs12、Nodejs14、Nodejs16、Nodejs18、Nodejs20
"keepRunningAfterReturn": true // 是否在云函数return之后继续执行,仅腾讯云nodejs12生效,详情见下方说明
}

定时任务triggers
支付宝云与阿里云定时触发的cron表达式不支持代表年的第七位,但是在package.json内配置时仍需将第七位设置为*。
/uniCloud-alipay/cloudfunctions/demoObj/package.json
{
"name": "demoObj",
"dependencies": {},
"extensions": {
"uni-cloud-jql": {}
},
"cloudfunction-config": {
"memorySize": 256,
"timeout": 60,//超时时间
"triggers": [{
}],
"path": "",
"runtime": "Nodejs18"
}
}
/uniCloud-alipay/cloudfunctions/demoObj/package.json
const db = uniCloud.database();
const dbJQL = uniCloud.databaseForJQL()
const dbCmd = db.command
module.exports = {
_before: function() { // 通用预处理器
// 开始的时间
this.startTime = Date.now()
this.params = {
name: "ABC"
};
this.clientInfo = this.getClientInfo();
// 主动抛出一个错误,中断当前代码的执行,并将错误信息返回给调用方
if (false) {
throw new Error("没有权限");
}
},
// 不传值时默认size=3
async getUser(size = 3) {
let res = await dbJQL.collection("demo-user")
.limit(size)
.get()
return res;
},
async addUser(params = {}) {
let res = await dbJQL.collection("demo-user")
.add(params)
return res;
console.log(res);
},
async updateUser(id = "") {
let res = await dbJQL.collection("demo-user")
.doc(id)
.update({
like: ["唱", "跳", "rap", "篮球"]
})
// let res = await db.collection("demo-user")
// .doc(id)
// .update({
// like: dbCmd.push(["踢足球"]),
// })
console.log(res);
},
async removeUser(id = "") {
let res = await dbJQL.collection("demo-user")
.doc(id)
.remove();
console.log(res);
},
async demo() {
/* let username = "匿名" + Math.random().toString(36).substring(3, 9);
let rdmage = Math.floot(Math.random() * (50 - 10 + 1) + 10) + "";
let res = await dbJQL.collection("demo-user")
.add({
name: username,
age: rdmage
});
return res */
},
_after(error, result) {
if (error) {
throw error
}
// 追加
result.author = "ABC"
// 查询数据用了多少时间
result.timeCost = Date.now() - this.startTime
return result;
},
async _timing() {
let username = "匿名" + Math.random().toString(36).substring(3, 9);
let rdmage = Math.floor(Math.random() * (50 - 10 + 1)) + 10 + "";
let res = await dbJQL.collection("demo-user").add({
name: username,
age: rdmage
})
console.log(res);
return res;
}
}
18.云对象url化可以自主开发api接口
const db = uniCloud.database();
const dbJQL = uniCloud.databaseForJQL()
const dbCmd = db.command
module.exports = {
_before: function() { // 通用预处理器
// 开始的时间
this.startTime = Date.now()
this.params = {
name: "ABC"
};
this.clientInfo = this.getClientInfo();
// 主动抛出一个错误,中断当前代码的执行,并将错误信息返回给调用方
if (false) {
throw new Error("没有权限");
}
},
// 不传值时默认size=3
async getUser({size = 3} = params) {
// !isNaN(size) :
// 取反操作,表示 "如果 size 是有效数字"
if (!isNaN(size)) {
size = Number(size)
} else {
return {
errMsg: "参数格式有误,需要number类型"
}
}
let res = await dbJQL.collection("demo-user")
.limit(size)
.get()
return res;
},
async addUser(params = {}) {
let res = await dbJQL.collection("demo-user")
.add(params)
return res;
console.log(res);
},
async updateUser(id = "") {
let res = await dbJQL.collection("demo-user")
.doc(id)
.update({
like: ["唱", "跳", "rap", "篮球"]
})
console.log(res);
},
async removeUser(id = "") {
let res = await dbJQL.collection("demo-user")
.doc(id)
.remove();
console.log(res);
},
async demo() {
/* let username = "匿名" + Math.random().toString(36).substring(3, 9);
let rdmage = Math.floot(Math.random() * (50 - 10 + 1) + 10) + "";
let res = await dbJQL.collection("demo-user")
.add({
name: username,
age: rdmage
});
return res */
},
_after(error, result) {
if (error) {
throw error
}
// 追加
// result.author = "ABC"
// 查询数据用了多少时间
// result.timeCost = Date.now() - this.startTime
return result;
},
async _timing() {
let username = "匿名" + Math.random().toString(36).substring(3, 9);
let rdmage = Math.floor(Math.random() * (50 - 10 + 1)) + 10 + "";
let res = await dbJQL.collection("demo-user").add({
name: username,
age: rdmage
})
console.log(res);
return res;
}
}
19.内置云存储介绍uni.chooselmage本地选择图片
内置云存储的上传方式有3种:
- web界面:即在uniCloud控制台 web控制台,点击云存储,通过web界面进行文件上传。该管理界面同时提供了资源浏览、删除等操作界面。
- 客户端API或组件上传:在前端js中编写
uniCloud.uploadFile
,或者使用uni ui的FilePicker组件,文件选择+上传均封装完毕。 - 云函数上传文件到云存储:即在云函数js中编写
uniCloud.uploadFile
uni.chooseImage(OBJECT) | uni-app官网
布局