Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
unidocs-zh
提交
9be36c81
unidocs-zh
项目概览
DCloud
/
unidocs-zh
通知
3195
Star
106
Fork
812
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
93
列表
看板
标记
里程碑
合并请求
69
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
unidocs-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
93
Issue
93
列表
看板
标记
里程碑
合并请求
69
合并请求
69
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
未验证
提交
9be36c81
编写于
2月 25, 2022
作者:
DCloud_Heavensoft
提交者:
Gitee
2月 25, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update docs/uniCloud/cloud-obj.md.
上级
bc9458a1
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
81 addition
and
55 deletion
+81
-55
docs/uniCloud/cloud-obj.md
docs/uniCloud/cloud-obj.md
+81
-55
未找到文件。
docs/uniCloud/cloud-obj.md
浏览文件 @
9be36c81
...
...
@@ -2,11 +2,65 @@
> 新增于 HBuilderX 3.4.0
云对象本质上是对云函数的封装,和传统方式通过callFunction调用云函数相比,云对象写法更简单,调用更清晰。另外云对象默认支持
[
uniCloud响应体规范
](
uniCloud/cf-functions.md?id=resformat
)
,对于满足规范的错误响应会在客户端自动抛出错误,开发者可以少写很多繁琐的判断。
## 背景和优势
以下面的云函数为例,对比一下云对象和传统云函数
20年前,restful接口开发开始流行,服务器编写接口,客户端调用接口,传输json。
**传统callFunction方式代码如下:**
现在,替代restful的新模式来了。
云对象,服务器编写API,客户端调用API,不再开发传输json的接口。思路更清晰、代码更精简。
比如服务端编写一个云对象todo,该对象有add、get、remove、update等方法。客户端的js则可以直接import这个todo云对象,直接调用add等方法。
服务器示例代码如下:
HBuilderX中在uniCloud/cloudfunctions目录新建云函数,选择类型为云对象,起名为todo。打开云对象入口index.obj.js,添加一个add方法。
```
js
// 云对象名:todo
module
.
exports
=
{
add
(
title
,
content
)
{
title
=
title
.
trim
()
content
=
content
.
trim
()
if
(
!
title
||
!
content
)
{
return
{
errCode
:
'
INVALID_TODO
'
,
errMsg
:
'
TODO标题或内容不可为空
'
}
}
// ...其他逻辑
return
{
errCode
:
0
,
errMsg
:
'
创建成功
'
}
}
}
```
然后在客户端的js中,import这个todo对象,调用它的add方法
```
js
const
todo
=
uniCloud
.
importObject
(
'
todo
'
)
//第一步导入云对象
async
function
addTodo
()
{
try
{
const
res
=
await
todo
.
add
(
'
title demo
'
,
'
content demo
'
)
//导入云对象后就可以直接调用该对象的方法了,注意使用异步await
uni
.
showToast
({
title
:
'
创建成功
'
})
}
catch
(
e
)
{
// 符合uniCloud响应体规范 https://uniapp.dcloud.net.cn/uniCloud/cf-functions?id=resformat,自动抛出此错误
uni
.
showModal
({
title
:
'
创建失败
'
,
content
:
e
.
errMsg
,
showCancel
:
false
})
}
}
```
可以看到云对象的代码非常清晰,代码行数也只有33行。
而同样的逻辑,使用传统的接口方式则需要更多代码,见下:
```
js
// 传统方式调用云函数-云函数代码
...
...
@@ -83,60 +137,22 @@ async function addToDo () {
}
```
**使用云对象的写法如下:**
以上传统开发需要68行代码,对比云对象的33行代码,不但工作量大,而且逻辑也不如云对象清晰。
```
js
// 使用云对象的写法-云对象代码
// 云对象名:todo
// 云对象入口index.obj.js内容如下
module
.
exports
=
{
add
(
title
,
content
)
{
title
=
title
.
trim
()
content
=
content
.
trim
()
if
(
!
title
||
!
content
)
{
return
{
errCode
:
'
INVALID_TODO
'
,
errMsg
:
'
TODO标题或内容不可为空
'
}
}
// ...其他逻辑
return
{
errCode
:
0
,
errMsg
:
'
创建成功
'
}
}
}
_注:以上例子仅用于方便初学者理解。实质上对于简单的数据库操作,使用clientDB在前端直接操作数据库是更简单、代码更少的方案,[另见](/uniCloud/clientdb)_
// 使用云对象的写法-客户端代码
const
todo
=
uniCloud
.
importObject
(
'
todo
'
)
async
function
addTodo
()
{
try
{
const
res
=
await
todo
.
add
(
'
title demo
'
,
'
content demo
'
)
uni
.
showToast
({
title
:
'
创建成功
'
})
}
catch
(
e
)
{
// 此形式响应符合uniCloud响应体规范中的错误响应,自动抛出此错误
// {
// errCode: 'INVALID_TODO',
// errMsg: 'TODO标题或内容不可为空'
// }
uni
.
showModal
({
title
:
'
创建失败
'
,
content
:
e
.
errMsg
,
showCancel
:
false
})
}
}
```
可以看到大量的业务无关代码被简化掉,开发效率UP。此外通过
`ObjectName.MethodName`
的方式调用云函数和云端写法完全一致,心智负担大幅减小。请阅读以下内容深入了解云对象
总结下云对象带来的好处:
1.
更清晰的逻辑
2.
更精简的代码
3.
更少的协作成本(以及矛盾~)
4.
客户端调用时在ide里有完善的代码提示,方法参数均可提示。(传输json可没法在ide里提示)
5.
自动支持
[
uniCloud响应体规范
](
uniCloud/cf-functions.md?id=resformat
)
,方便错误拦截和统一处理
## 快速上手
### 创建云对象
和创建云函数一样,在
`cloudfunctions`
目录右键即可
输入云对象名称创建云对象,此处以云对象todo为例,创建的云对象包含一个
`index.obj.js`
。内容如下
云对象,其实是对云函数的封装。和创建云函数一样,在
`uniCloud/cloudfunctions`
目录右键新建云函数,选择云对象类型,
输入云对象名称创建云对象,此处以云对象todo为例,创建的云对象包含一个
`index.obj.js`
。内容如下
```
js
// cloudfunctions/todo/index.obj.js
...
...
@@ -159,7 +175,7 @@ module.exports = {
errMsg
:
'
TODO标题或内容不可为空
'
}
}
// ...其他逻辑
// ...其他逻辑
,如操作todo数据表添加数据
return
{
errCode
:
0
,
errMsg
:
'
创建成功
'
...
...
@@ -305,9 +321,9 @@ module.exports = {
### 预处理 _before@before
云对象内可以创建一个特殊的方法_
after用来在调用方法之前进行一些额外的操作
云对象内可以创建一个特殊的方法_
before,用来在调用常规方法之前进行预处理,一般用于拦截器、身份验证、参数校验等。
请看以下示例:
以下示例的逻辑是,当客户端调用todo云对象的add方法时,会先执行_before方法中的逻辑,判断为add方法时校验了客户端token,校验失败则直接报错返回客户端,校验通过继续执行add方法。
```
js
// todo/index.obj.js
...
...
@@ -329,7 +345,7 @@ module.exports = {
### 后处理 _after@after
云对象内可以创建一个特殊的方法_after用来
处理本次调用方法的返回结果或者抛出的错误
与预处理
`_before`
对应的是后处理
`_after`
。云对象内可以创建一个特殊的方法_after用来再加工
处理本次调用方法的返回结果或者抛出的错误
请看以下示例:
...
...
@@ -462,4 +478,14 @@ const res = await todo.add('title demo', 'content demo')
## 本地运行@run-local
云对象无法直接本地运行,可以通过其他云函数调用本地云对象(在调用云对象的云函数右键本地运行),或者客户端调用本地云对象的方式来实现云对象的本地运行。
\ No newline at end of file
云对象无法直接本地运行,可以通过其他云函数调用本地云对象(在调用云对象的云函数右键本地运行),或者客户端调用本地云对象的方式来实现云对象的本地运行。
## 推荐最佳实践
uniCloud的服务器和客户端交互,有云函数、云对象、clientDB三种方式。
从云对象发布后,不再推荐使用传统云函数了。
如果是以数据库操作为主,则推荐使用clientDB,开发效率是最高的。
如果服务器端除了操作数据库外,还有复杂的、不宜公开在前端的逻辑,此时推荐使用云对象。
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录