在unicloud的云对象中如何调用同一服务空间内的另外其他云对象

需求描述

云函数或云对象内也可以调用同一服务空间内的云对象,用法和客户端调用云对象一致。 const todo = uniCloud.importObject('todo'); const res = await todo.add('title demo', 'content demo')

以上是官方示例,云对象间是可以互相调用的,但是这样有个前提,那就是被调用的云对象不是使用的JQL语法格式,大家应该知道使用JQL语法查询数据库的话,是需要有scheme表结构权限验证的,涉及到权限那就需要clientInfo获取客户端传过来的信息,如果不传,那调用其他云对象的时候就肯定会报错 Error: 未能获取当前用户信息:当前用户为匿名身份。

那么如果解决这个云对象间互相调用没有权限的问题那,下面给大家介绍两种方法,以供参考。

一、在云对象中通过传统方式操作数据库

因为传统形式查询数据库是不校验scheme表结构的,所以即时匿名身份也可以访问其他的云对象,通常传统的方式需要自己根据客户端传入的token来进行安全校验的,如果不校验那么任何人就都可以访问你的云对象,这样其实是有安全隐患的,但是这种方式确实是可以解决云对象间互相调用出错的问题的。

通过实际的业务场景来介绍: client-scores是一个负责处理积分的云对象,在云对象内有个pass方法,代表这认证成功执行passScore方法,就可以在个人积分中增加积分; client-user是一个处理用户信息的云对象,在云对象中有个userPass方法,该方法处理用户认证,如果认证成功就调用client-scores云对象内的passScore增加积分。

  • client-scores云对象
javascript 复制代码
let db = uniCloud.database();

module.exports = {
	async passScore(){		
		let passScore = parseInt(Math.random() * 10);
		let item = {
			score: passScore,		
			desc: `认证成功获得${passScore}积分`,
			create_date:Date.now()
		};
		//新增积分记录
		return  await db.collection('JLJ-scores').add(item);	
	}
}
  • client-user云对象
javascript 复制代码
let dbJQL = uniCloud.databaseForJQL();
let scoreCloudObj = uniCloud.importObject('client-scores');

module.exports = {
	_before: function () {
		const clientInfo = this.getClientInfo();
		dbJQL = uniCloud.databaseForJQL({ clientInfo });
	},
	async userPass(){
		//修改用户信息
		await dbJQL.collection('uni-id-users').where(`user_id == $cloudEnv_uid`).update({isPass:true});
		//完成修改后,调用client-scores云对象内的passScore方法修改积分
		return await scoreCloudObj.passScore();
	}
}

如上所示,在 client-user云对象内调用client-scores云对象,需要将被调用云对象内常用JLQ语法换成传统的 db = uniCloud.database() 这样才不会报权限问题,可以实现调用修改功能。

注意: 如上面所将,不使用JQL语法,就无法使用scheme进行校验,会有安全隐患,而且JQL语法操作数据库方便,所以建议使用第二种方式,迫不得已可以使用第一种方案。

二、调用其他云对象时可以传参

这种方式是比较通用的,建议使用这种方式,非常的简单,只需要在_before内获取clientInfo多做一下判断即可,这样最大的好处就是,可以继续沿用JQL语法,只是在调用其他方法的时候注意传参即可。

  • client-scores云对象
javascript 复制代码
let dbJQL = uniCloud.databaseForJQL();

module.exports = {
	_before: function () {	
		//获取调用该云对象传递的参数,参数会默认放到数组中
		const params = this.getParams();
		let clientInfo;
		//如果有传参并且参数中包含clientInfo,那就使用传递过来的clientInfo
		if (params && params[0] && params[0].clientInfo) {
			clientInfo = params[0].clientInfo;
		} else {
			clientInfo = this.getClientInfo();
		}
		dbJQL = uniCloud.databaseForJQL({ clientInfo });
	},
	async passScore(){		
		let passScore = parseInt(Math.random() * 10);
		let item = {
			score: passScore,		
			desc: `认证成功获得${passScore}积分`,
			create_date:Date.now()
		};
		//新增积分记录
		return  await dbJQL .collection('JLJ-scores').add(item);	
	}
}
  • client-user云对象
javascript 复制代码
let dbJQL = uniCloud.databaseForJQL();
let scoreCloudObj = uniCloud.importObject('client-scores');

module.exports = {
	_before: function () {
		const clientInfo = this.getClientInfo();
		dbJQL = uniCloud.databaseForJQL({ clientInfo });
	},
	async userPass(){		
		await dbJQL.collection('uni-id-users').where(`user_id == $cloudEnv_uid`).update({isPass:true});
		
		//获取当前云对象中的clientInfo客户端信息及token,传递给被调用的云对象中
		let clientInfo = this.getClientInfo();
		let token = clientInfo.uniIdToken;
		return await scoreCloudObj.passScore({
			clientInfo,
			token 
		});
	}
}

上面这种方法是参考了uni-pay官方的写法格式,比较推荐实用这种方式,只需要在调用的时候获取当前的clientInfo客户信息,传递给别调用的云对象中,就可以共享客户端信息了,从而不影响使用JQL写法,而且可以启用scheme进行表结构安全校验。

相关推荐
2501_920931701 小时前
React Native鸿蒙跨平台采用ScrollView的horizontal属性实现横向滚动实现特色游戏轮播和分类导航
javascript·react native·react.js·游戏·ecmascript·harmonyos
东东5163 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino3 小时前
图片、文件的预览
前端·javascript
2501_920931704 小时前
React Native鸿蒙跨平台实现推箱子游戏,完成玩家移动与箱子推动,当所有箱子都被推到目标位置时,玩家获胜
javascript·react native·react.js·游戏·ecmascript·harmonyos
AI老李5 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
方也_arkling5 小时前
Element Plus主题色定制
javascript·sass
2601_949809595 小时前
flutter_for_openharmony家庭相册app实战+我的Tab实现
java·javascript·flutter
Up九五小庞6 小时前
开源埋点分析平台 ClkLog 本地部署 + Web JS 埋点测试实战--九五小庞
前端·javascript·开源
摘星编程6 小时前
React Native + OpenHarmony:UniversalLink通用链接
javascript·react native·react.js
qq_177767376 小时前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos