uniCloud学习简记
基本概念
服务空间
- 右键uniCloud 目录=》创建服务空间
- uniCloud的web控制台.管理服务空间
数据库
- 数据库及数据表
- 一个uniCloud服务空间,有且只有一个数据库;
- 一个数据库可以有多个表;
- 一个表可以有多个记录;
- 一个记录可以有多个字段。
- 数据表创建方式
-
在web控制台创建
-
在HBuilderX中,项目根目录
/uniCloud/database
点右键新建DB schema
,上传时创建 -
在代码中也可以创建表,但不推荐使用,详见uniCloud官方文档
-
操作数据库
- 客户端直接操作数据库(clientDB):,
- 用js API操作云数据库:推荐JQL语法
<unicloud-db>
组件:js API的再封装。unicloud-db组件简介
- 云函数/云对象内使用JQL,链接
- 客户端直接操作数据库(clientDB):,
-
云函数/云对象
- 在
uniCloud/cloudfunctions
目录右键
新建云函数/云对象 - 每个云函数是1个目录,普通云函数的入口文件:index.js,云对象的入口文件是index.obj.js
- 客户端和云函数的通信方式
传统的restful方式 | callfunction方式 | 云对象方式 | clientDB方式 | |
---|---|---|---|---|
简述 | 通过配置云函数URL化 ,把云函数转为传统的http链接 | 云函数默认并不自带http链接 | 把callfunction的函数式调用,升级为模块化的对象调用 | 客户端直接操作云数据库 |
前端调用方式 | 传统ajax | uni-app客户端通过uniCloud.callFunction(functionname) 来调用云函数 | uni-app客户端通过uniCloud.importObject(objectname) 导入一个云对象,直接使用这个对象的方法 | uni-app客户端通过<uniCloud-db>组件 或uniCloud.database() API 来访问uniCloud数据库。也支持搭配action云函数追加服务器逻辑 |
适用场景 | http链接需要自己注册域名。如果前端是uni-app,则不推荐使用URL化。如果是非uni-app的系统需要访问云函数,只能使用URL化 | 相比云函数URL,callfunction更加安全、更serverless,不暴露域名和ip,不怕攻击,也无需注册域名 | uni-app 3.4起支持。相比callfunction方式。代码更加精简、逻辑更加清晰、开发更加高效 | 如果uni-app前端发起的服务器请求目的主要是查询或操作数据库,则推荐使用clientDB方式 |
- 云对象
-
目录结构
-
-
函数内部代码
index.obj.js
-
// 云对象教程: https://uniapp.dcloud.net.cn/uniCloud/cloud-obj
// jsdoc语法提示教程:https://ask.dcloud.net.cn/docs/#//ask.dcloud.net.cn/article/129
module.exports = {
// 目前有3个内置特殊方法:_before、_after、_timing 所有_开头的方法都是私有方法,客户端不可访问
_before: function() { // 通用预处理器
this.startTime = Date.now() // 在before内记录开始时间并在this上挂载,以供后续流程使用
// 当客户端调用todo云对象的add方法时,会先执行_before方法中的逻辑,
// 判断为add方法时校验了客户端token,校验失败则直接报错返回客户端,校验通过继续执行add方法。
const methodName = this.getMethodName()
console.log('当前调用的方法名===',methodName)
// if (methodName === 'add' && !this.getUniIdToken()) {
// throw new Error('token不存在')
// }
},
/**
* method1方法描述
* @param {string} param1 参数1描述
* @returns {object} 返回值描述
*/
/*
method1(param1) {
// 参数校验,如无参数则不需要
if (!param1) {
return {
errCode: 'PARAM_IS_NULL',
errMsg: '参数不能为空'
}
}
// 业务逻辑
// 返回结果
return {
param1 //请根据实际需要返回值
}
}
*/
add: function(title = '', content = '') {
title = title.trim()
content = content.trim()
if (!title || !content) {
return {
errCode: '无效',
errMsg: '标题或内容不能为空'
}
}
if (title === 'abc') {
throw new Error('abc不是一个合法的todo标题')
}
//
return {
errCode: 0,
errMsg: '创建成功'
}
//
},
//
_after(error, result) {
if (error) {
throw error // 如果方法抛出错误,也直接抛出不处理
}
result.timeCost = Date.now() - this.startTime
return result
}
//uni错误规范
// UniError https://uniapp.dcloud.net.cn/tutorial/err-spec.html#
// returnu代码块 触发
// 格式
// return {
// errSubject: '',
// errCode: 0,//错误码,数字类型,0:成功,其它为错误码
// errMsg: ''
// }
}
todo.param.js
// 本文件中的内容将在云对象【运行】时解析为运行参数
// 配置教程参考:https://uniapp.dcloud.net.cn/uniCloud/rundebug.html#run-obj-param
//运行云对象时传配置运行测试参数
add('abc1','test')
前端js中调用云对象
async testco() { // 注意异步
//导入云对象 :cco字符快速触发 uniCloud.importObject代码块
const helloCo = uniCloud.importObject('testco')
try {
//导入云对象后就可以直接调用该对象的sum方法了,注意使用异步await
const res = await helloCo.sum(1, 2)
console.log('调用云对象方法', res)
} catch (e) {
//TODO handle the exception
console.log(e)
}
},