学习:uniCloud云开发Vue3版本(5)

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不支持的方法可以使用传统云函数解决

云函数通过传统方式操作数据库 | uniCloud

复制代码
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

内置特殊方法 | uniCloud

目前有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

定时触发 | uniCloud

云函数package.json | uniCloud

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接口

url化 | uniCloud

复制代码
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种:

  1. web界面:即在uniCloud控制台 web控制台,点击云存储,通过web界面进行文件上传。该管理界面同时提供了资源浏览、删除等操作界面。
  2. 客户端API或组件上传:在前端js中编写uniCloud.uploadFile,或者使用uni ui的FilePicker组件,文件选择+上传均封装完毕。
  3. 云函数上传文件到云存储:即在云函数js中编写uniCloud.uploadFile

uni.chooseImage(OBJECT) | uni-app官网

布局

相关推荐
西岸行者6 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意6 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码6 天前
嵌入式学习路线
学习
毛小茛6 天前
计算机系统概论——校验码
学习
babe小鑫6 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms6 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下6 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。6 天前
2026.2.25监控学习
学习
im_AMBER6 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J6 天前
从“Hello World“ 开始 C++
c语言·c++·学习