提交 a1406c98 编写于 作者: W wanganxp

更新uniCloud大量文档

上级 b18e9cfd
......@@ -12,8 +12,9 @@
3. 如果你已拥有掌握php和js的全栈,那么改用新的技术栈,一样可以大幅提升开发效率、降低成本;
4. 你只需专注于你的业务,其他什么服务器运维、弹性扩容、大并发承载、防DDoS攻击,全都不需要操心;
5. 除了开发成本,云资源租用成本也将大幅下降
6. 如果不发布H5版,你将不需要购买备案域名。小程序和App可以免域名使用服务器;
6. 如果不发布Web版,你将不需要购买备案域名。小程序和App可以免域名使用服务器;
目前uniCloud阿里云版免费,助力开发者低门槛实现自己的想法。
### 看视频,只需25分钟,快速入门uniCloud
......@@ -29,7 +30,7 @@ uniCloud是DCloud在阿里云和腾讯云的serverless服务上封装而成的
开发者可以自主选择uniCloud的硬件和网络资源的供应商,在阿里云版和腾讯云版之间切换。
开户和付费虽然通过DCloud渠道,但实际上开发者自动在云厂商处建立了账户和充值了余额。DCloud只获取云服务厂商的返佣。
开户和付费虽然通过DCloud渠道,但实际上开发者自动在云厂商处建立了账户和充值了余额。价格是云厂商的标准定价,DCloud只获取云服务厂商的返佣。
开发时虽使用DCloud的工具,但应用上线时,手机端是直连阿里云或腾讯云的serverless,不经由DCloud的服务器。
......@@ -62,7 +63,7 @@ serverless的云,真正的把计算、存储的能力进行了云化,开发
云端庞大的serverless资源池,有无数个node进程待命。当手机用户发起请求时,serverless系统会调配闲置的资源来运行开发者相应的云函数。
- serverless,让一个不懂服务器运维的开发者,可以只处理自己的业务,再不用关心热备、负载、增容、DDOS等事情。
- serverless,让一个学生,也可以享受世界最顶级的IT基础设置。
- serverless,让一个学生,也可以享受世界最顶级的IT基础设置。
serverless在国外兴起,但国内的发展速度已经超过了国外。微信、支付宝、百度、字节跳动、快应用联盟都上线了自己的serverless云开发。
......@@ -108,7 +109,7 @@ serverless不是传统云,它不需要开发者选择CPU和内存配置,也
基于以上3点原因,uniCloud大幅降低了开发者云资源的租用成本。
除了云资源的成本,uniCloud还可以减少开发商的人工成本、招聘成本、沟通管理成本,这些成本往往远大于云资源成本。
除了云资源的成本,uniCloud还可以减少开发商的人工成本、招聘成本、沟通管理成本,这些成本远大于云资源成本。
### uniCloud降低前端掌握后端的门槛
......@@ -126,7 +127,9 @@ serverless不是传统云,它不需要开发者选择CPU和内存配置,也
3. uniCloud推出了[opendb](https://gitee.com/dcloud/opendb),包含了大量的开源数据库模板,常见数据表无需自己设计。通过opendb模板,开发者可以快速掌握数据库设计。
4. SQL在过去也需要单独学习,尤其是复杂的联表查询、Tree查询,掌握很不容易。uniCloud推出了JQL(Javascript Query Language),会js即可掌握数据库查询,更对联表查询、Tree查询提供了非常简便的操作封装。
5. uniCloud提供了[uni-id](https://uniapp.dcloud.net.cn/uniCloud/uni-id),无需自己开发账户体系,登录、注册、修改密码、角色权限体系、token管理一应俱全。
6. uniCloud在[DB Schema](https://uniapp.dcloud.net.cn/uniCloud/schema)中提供了与[uni-id](https://uniapp.dcloud.net.cn/uniCloud/uni-id)的角色权限体系配套的数据权限控制方案。这套方案让小白也不会在权限控制中犯错。在一目了然的权限配置清单中可以轻松发现漏做的事情,比以往在大坨php代码中分析是否存在权限漏洞要简单的多。这套方案还能让多人协作、或项目二次开发变的更容易,因为规范的存在,新人可以轻易读懂老代码的权限体系逻辑。
6. uniCloud在[DB Schema](https://uniapp.dcloud.net.cn/uniCloud/schema)中提供了与[uni-id](https://uniapp.dcloud.net.cn/uniCloud/uni-id)的角色权限体系配套的数据权限控制方案。这套方案让初学者也不会在权限控制中犯错。
在一目了然的权限配置清单中可以轻松发现漏做的事情,比以往在大坨php代码中分析是否存在权限漏洞要简单的多。
这套方案还能让多人协作、或项目二次开发变的更容易,因为规范的存在,新人可以轻易读懂老代码的权限体系逻辑。
所以说,uniCloud是前端变全栈的最佳机会,只需花点时间熟读uniCloud的文档,你就可以成为全栈!
......@@ -164,10 +167,11 @@ uni云端一体生态的内容太多,让我们抽丝剥茧、归纳分类,
1. 提供众多现成轮子,不用自己写代码
2. 如果没有现成轮子,那么用[schema2code](https://uniapp.dcloud.net.cn/uniCloud/schema?id=autocode)代码生成工具,生成数据库的增删改查页面(是直接生成页面,不是生成接口)
3. 如果schema2code搞不定,需要手写代码,那么使用[clientDB](https://uniapp.dcloud.net.cn/uniCloud/clientdb),将节省80%的服务端开发工作
4. HBuilderX在云端协同中提供工具助力
5. 端和云的语言统一,提高了沟通效率、招聘效率
6. 代码量的减少到原来的十分之一,让code review效率和测试的效率也提升了十倍
7. serverless让开发者专注于业务,无需分心运维
4. 如果仍然需要写云端代码,那么云对象让你的开发更简单
5. HBuilderX在云端协同中提供工具助力
6. 端和云的语言统一,提高了沟通效率、招聘效率
7. 代码量的减少到原来的十分之一,让code review效率和测试的效率也提升了十倍
8. serverless让开发者专注于业务,无需分心运维
我们来依次展开介绍每一层。
......@@ -184,13 +188,15 @@ uni云端一体生态的内容太多,让我们抽丝剥茧、归纳分类,
**1. 官方维护的插件**
- uni-id:不用再开发用户系统。用户注册、登录(含社交登录、短信验证码登录、App一键登录)、修改或重置密码、token管理、图形验证码、RBAC权限角色系统...所有与用户相关的,不管前端还是云端,代码都是现成的。[详见](https://uniapp.dcloud.net.cn/uniCloud/uni-id)
- uniPay:不管微信还是支付宝,不管App、微信小程序、还是支付宝小程序,不管前端还是服务端,一切都现成的,拿来即用。[详见](https://uniapp.dcloud.net.cn/uniCloud/unipay)
- uSearch:云端一体搜索。搜索页面、输入联想、搜索历史记录、热搜词分析提取...一应俱全。[详见](https://ext.dcloud.net.cn/plugin?id=3851)
- uni-id:不用再开发用户系统。用户注册、登录(含社交登录、短信验证码登录、App一键登录)、修改或重置密码、token管理、图形验证码、RBAC权限角色系统...所有与用户相关的,不管前端还是云端,代码都是现成的。[详见](/uniCloud/uni-id-summary)
- uni-pay:不管微信还是支付宝,不管App、微信小程序、还是支付宝小程序,不管前端还是服务端,一切都现成的,拿来即用。[详见](/uniCloud/unipay)
- uni-starter:云端一体应用快速开发基本项目模版,实现快速搭建一款应用。它集成了很多通用的功能,比如登录注册、头像、设置、拦截器、banner...[详见](https://ext.dcloud.net.cn/plugin?id=5057)
- uniCloud Admin:全端可用的admin后台。自带用户管理、权限管理、角色管理、菜单管理。更有众多admin插件,比如cms插件、banner管理插件、App升级管理插件...[详见](https://uniapp.dcloud.net.cn/uniCloud/admin)
- uni-admin:全端可用的admin后台。自带用户管理、权限管理、角色管理、菜单管理、业务图表统计。更有众多admin插件,比如cms插件、banner管理插件、App升级管理插件...[详见](/uniCloud/admin)
- uni-search:云端一体搜索。搜索页面、输入联想、搜索历史记录、热搜词分析提取...一应俱全。[详见](https://ext.dcloud.net.cn/plugin?id=3851)
- uni-file-picker:前端直传uniCloud存储组件。[详见](https://ext.dcloud.net.cn/plugin?id=4079)
- uni-captcha:云端一体图形验证码组件。[详见](https://ext.dcloud.net.cn/plugin?id=4048)
- uni-sec-check:免费的内容安全审查,防止用户提交违法的文字或图片。[详见](https://ext.dcloud.net.cn/plugin?id=5460)
- uni-upgrade-center:App升级中心。支持整包升级、wgt热更新;支持直接下载安装包或跳转应用商店。[详见](uniCloud/upgrade-center.md)
**2. 社区的优秀插件**
......@@ -292,7 +298,50 @@ clientDB技术,有前端的[JS API](https://uniapp.dcloud.net.cn/uniCloud/clie
可以看出,在uni云端一体生态中,开发者不但提高了效率、减少了成本,还得到了更强大的赋能工具。
#### 第四层提效:HBuilderX工具助力
#### 第四层提效:云对象,改变前后端协同
如果clientDB仍然不能满足需求,必须编写云端代码,那么[云对象](uniCloud/cloud-obj.md)的出现,彻底改变了后端开发json接口和前端联调的低效局面。
[云对象](uniCloud/cloud-obj.md)把云端的代码变成对象方式,让前端js直接import这个对象,然后使用这个对象的方法,就像使用前端的js对象一样顺畅。
云端新加一个`todo`云对象,写一个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
console.log("add成功")
} catch (e) {
// 符合uniCloud响应体规范 https://uniapp.dcloud.net.cn/uniCloud/cf-functions?id=resformat,自动抛出此错误
console.log(e.errMsg)
}
}
```
#### 第五层提效:HBuilderX工具助力
HBuilderX、uni-app、uniCloud是三位一体、高效协同的。
......@@ -305,8 +354,9 @@ HBuilderX提升了uni-app的开发效率,自然也将提升uniCloud的开发
由于三位一体协同,HBuilderX可以解析本地schema文件,直接提示item后面的数据结构。避免开发者写错代码、减少服务器联调工作。
![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-f184e7c3-1912-41b2-b81f-435d1b37c7b4/88f093d0-1abd-487d-bf24-e0627c471977.jpg)
云对象的方法,HBuilderX同样可以完美解析,让编写客户端代码时直接提示云对象的方法、参数。
#### 第层提效:语言统一的价值
#### 第层提效:语言统一的价值
前端和云端都使用js编程语言,提高了沟通效率。
......@@ -316,7 +366,7 @@ js和其他服务器语言,比如php或java,在过去需要Mock来翻译,
由于统一了技术栈,招聘效率、管理效率也会相应提升。。
#### 第层提效:测试效率的提升
#### 第层提效:测试效率的提升
代码量的减少到原来的十分之一,这自然可以让code review效率和白盒测试的效率也提升了十倍。
......@@ -324,7 +374,7 @@ js和其他服务器语言,比如php或java,在过去需要Mock来翻译,
现在,开发、测试都将变的更加轻松。
#### 第层提效:serverless让开发者专注于业务,无需分心运维
#### 第层提效:serverless让开发者专注于业务,无需分心运维
因为serverless的免运维特点,开发商再也不用操心扩容、高并发、ddos攻击、安全漏洞补丁等一系列麻烦事。只需专注于自己的业务。
......
......@@ -4,11 +4,14 @@
* 基本概念
* [服务空间](uniCloud/concepts/space.md)
* [数据库](uniCloud/concepts/database.md)
* [云函数](uniCloud/concepts/cloudfunction.md)
* [云函数/云对象](uniCloud/concepts/cloudfunction.md)
* 云函数/云对象
* [开发云函数](uniCloud/cf-functions.md)
* [概述](uniCloud/cf-functions.md)
* [云对象](uniCloud/cloud-obj.md)
* [普通云函数(callFunction)](uniCloud/cf-callfunction.md)
* [云公共模块](uniCloud/cf-common.md)
<!-- * [运行调试](uniCloud/cf-rundebug.md) -->
<!-- * [发布](uniCloud/) -->
* [日志输出](uniCloud/cf-logger.md)
* [定时触发](uniCloud/trigger.md)
* [云函数URL化](uniCloud/http.md)
......
**普通云函数**
callFunction方式云函数,也称之为普通云函数。
uni-app的前端代码,不再执行`uni.request`联网,而是通过`uniCloud.callFunction`调用云函数。
callFunction方式避免了服务器提供域名,不暴露固定ip,减少被攻击的风险。
- 对于uni-app前端而言,使用云对象会比使用callFunction云函数方式更为简单清晰。
- 但对于非uni-app前端调用的场景,比如5+App、外部应用、服务器要调用云函数,或者uniCloud定时任务,此时不适合使用云对象,还是需要云函数。
`uniCloud.callFunction`可以在uni-app前端执行,也可以在uniCloud云函数中执行。也就是前端和云端都可以调用另一个云函数。
`callFunction`方法的参数和返回值如下:
## callFunction方法
`uniCloud.callFunction`需要一个json对象作为参数,其中包含2个字段
|字段 |类型 |必填 |说明 |
|:-: |:-: |:-: |:-: |
|name |String |是 |云函数名称|
|data |Object |否 |客户端需要传递的参数|
**返回json**
|字段 |类型 |说明 |
|:-: |:-: |:-: |
|result |Object |云函数返回结果 |
|requestId |String |云函数请求序列号,用于错误排查,可以在uniCloud web控制台的云函数日志中查到 |
|header |Object |服务器header信息 |
|errCode |Number或String |服务器错误码 |
|success |bool |执行是否成功 |
注意:HBuilderX本地运行云函数时只返回result,其他需要在云端运行云函数才会返回
**前端示例代码**
假使云服务空间有一个云函数名为“hellocf”,那么前端可以通过如下方式调用这个云函数
```javascript
// promise方式
uniCloud.callFunction({
name: 'hellocf',
data: { a: 1 }
})
.then(res => {});
// callback方式
uniCloud.callFunction({
name: 'hellocf',
data: { a: 1 },
success(){},
fail(){},
complete(){}
});
```
## 云函数的入参
客户端callFunction调用云函数时,云函数通过入参接收客户端数据,通过头信息上下文获取客户端信息,经过业务逻辑处理后给客户端返回结果。
假使客户端代码调用云函数hellocf,并传递了{a:1,b:2}的数据,
```js
// 客户端调用云函数并传递参数
uniCloud.callFunction({
name: 'hellocf',
data: {a:1,b:2}
})
.then(res => {});
```
那么云函数侧的代码如下,将传入的两个参数求和并返回客户端:
```js
// hellocf云函数index.js入口文件代码
'use strict';
exports.main = async (event, context) => {
//event为客户端上传的参数
return {
sum:event.a + event.b
} // 通过return返回结果给客户端
}
```
云函数的传入参数有两个,一个是`event`对象,一个是`context`对象。
- `event`指的是触发云函数的事件。当客户端调用云函数时,`event`就是客户端调用云函数时传入的参数。
- `context` 对象包含了本次请求的上下文,包括客户端的操作系统(`os`)、运行平台(`platform`)、应用信息(`appid`
如下是一个示例:
```js
'use strict';
exports.main = async (event, context) => {
//event为客户端上传的参数
//...
//context中可获取客户端调用的上下文
let clientIP = context.CLIENTIP // 客户端ip信息
let clientUA = context.CLIENTUA // 客户端user-agent
let spaceInfo = context.SPACEINFO // 当前环境信息 {spaceId:'xxx',provider:'tencent'}
// 以下四个属性只有使用uni-app以callFunction方式调用才能获取,调用方不是uni-app客户端则没有相应数据
let os = context.OS //客户端操作系统,返回值:android、ios 等
let platform = context.PLATFORM //运行平台,返回值为 mp-weixin、app-plus等。注意:vue3版本uni-app将app-plus修改为了app,此处为保证旧版本兼容性未进行统一,推荐后续在业务中都使用app作为客户端标识
let appid = context.APPID // manifest.json中配置的appid
let deviceId = context.DEVICEID // 客户端标识,新增于HBuilderX 3.1.0,同uni-app客户端getSystemInfo接口获取的deviceId
//... //其它业务代码
}
```
**注意:下面所有的“客户端”均是相对于云函数而言,如果你使用自己的服务器调用云函数,此时客户端是指你的服务器**
### 获取用户token@client-token
如果客户端在storage内存储了uni_id_token,在使用callFunction请求云函数时会自动将此token传递到云端,云端可以通过以下方式获取:
```js
'use strict';
exports.main = async (event, context) => {
let token = event.uniIdToken // 客户端uni-id token
}
```
### 获取客户端IP@clientip
```js
'use strict';
exports.main = async (event, context) => {
let clientIP = context.CLIENTIP // 客户端ip信息
}
```
### 获取客户端user-agent@client-user-agent
```js
'use strict';
exports.main = async (event, context) => {
let clientUA = context.CLIENTUA // 客户端user-agent信息
}
```
### 获取服务空间信息@context-space-info
```js
'use strict';
exports.main = async (event, context) => {
let spaceInfo = context.SPACEINFO // 当前环境信息 {spaceId:'xxx',provider:'tencent'}
}
```
### 获取云函数调用来源@context-source
```js
'use strict';
exports.main = async (event, context) => {
let source = context.SOURCE // 当前云函数被何种方式调用
// client 客户端callFunction方式调用
// http 云函数url化方式调用
// timing 定时触发器调用
// server 由管理端调用,HBuilderX里上传并运行
// function 由其他云函数callFunction调用
}
```
### 其他客户端信息@client-info
> HBuilderX 3.4.9起,可以获取所有客户端`getSystemInfo`返回的客户端信息,详细字段列表参考:[getSystemInfo](https://uniapp.dcloud.net.cn/api/system/info.html#getsysteminfo)
```js
'use strict';
exports.main = async (event, context) => {
let os = context.OS //客户端操作系统,返回值:android、ios 等
let platform = context.PLATFORM //运行平台,返回值为 mp-weixin、app等。注意老版曾使用app-plus,具体见下
let appid = context.APPID // manifest.json中配置的appid
let deviceId = context.DEVICEID // 客户端标识,新增于HBuilderX 3.1.0,同uni-app客户端getSystemInfo接口获取的deviceId
}
```
**注意事项**
- 客户端上报的信息在理论上存在被篡改可能,实际业务中应验证前端传来的数据的合法性
- `context.PLATFORM`的取值,有 `app``app-plus` 两种情况。
* uni-app的vue3版本取值为`app`
* vue2版本,在uni-app 3.4.9之前,取值为 `app-plus`,uni-app 3.4.9起,该值修改为了`app`
- 阿里云event大小不可超过1MB,腾讯云event大小不可超过6MB
客户端信息只有使用uni-app客户端以callFunction方式调用才能获取,由客户端传递到云函数。如果云函数url化后被uni-app通过request调用,也没有客户端信息。
在云函数URL化的场景无法获取客户端平台信息,可以在调用依赖客户端平台的接口接口之前(推荐在云函数入口)通过修改context.PLATFORM手动传入客户端平台信息供其他插件(如:uni-id)使用
例:
```js
exports.main = async (event, context) => {
context.PLATFORM = 'app-plus'
}
```
## 云函数的返回格式
普通云函数返回给客户端的是json格式数据。返回结果包裹在result下。
前端发起callFunction到云端接收参数并响应,然后反馈前端,然后前端接收参数的完整流程代码如下:
```js
// 客户端发起调用云函数hellocf,并传入data数据
uniCloud.callFunction({
name: 'hellocf',
data: {a:1,b:2}
}).then((res) => {
console.log(res.result) // 结果是 {sum: 3}
}).catch((err) => {
console.error(err)
})
```
```js
// 云函数hellocf的代码,接收到客户端传递的data,并对其中a和b相加返回给客户端
'use strict';
exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('event : ', event)
//返回数据给客户端
return {sum : event.a + event.b}
};
```
那么客户端得到的res结构如下
```json
{
"errCode": 0
"header": {
"access-control-expose-headers": "Date,x-fc-request-id,x-fc-error-type,x-fc-code-checksum,x-fc-invocation-duration,x-fc-max-memory-usage,x-fc-log-result,x-fc-invocation-code-version"
"content-disposition": "attachment"
"content-length": "38"
"content-type": "application/json"
"date": "Sat, 25 Jun 2022 19:28:34 GMT"
"x-fc-code-checksum": "92066386860027743"
"x-fc-instance-id": "c-62b761c4-5a85e238b3ce404c817d"
"x-fc-invocation-duration": "23"
"x-fc-invocation-service-version": "LATEST"
"x-fc-max-memory-usage": "66.61"
"x-fc-request-id": "80854b93-b0c7-43ab-ab16-9ee9f77ff41e"
"x-serverless-request-id": "ac1403831656185314624173902"
"x-serverless-runtime-version": "1.2.2"
}
"requestId": "ac1403831656185314624173902"
"result": {sum: 3}
"success": true
}
```
其中`result`是开发者云函数代码返回的数据,其余是云平台返回的。
注意:HBuilderX本地运行云函数时只返回`result`,其他需要在云端运行云函数才会返回。
**uniCloud响应体规范**
为了方便统一拦截错误,推荐开发者使用`uniCloud响应体规范`[详见](uniCloud/cf-functions.md?id=resformat)
如果按照uniCloud响应体规范,那么云函数代码应该修正为return信息补充errCode和errMsg。如下:
```js
'use strict';
exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('event : ', event)
if (!event.a) {
return {errCode : 1,errMsg : "参数a不能为空"}
}
if (!event.b) {
return {errCode : 2,errMsg : "参数b不能为空"}
}
const c = event.a + event.b
if (isNaN(c)) {
return {errCode : 3,errMsg : "参数a和b无法求和"}
}
//返回数据给客户端
return {sum:c,errCode : 1,errMsg : "0"}
};
```
此差异已折叠。
......@@ -212,7 +212,9 @@ const todo = uniCloud.importObject('todo')
uniCloud有众多API,另见:[uniCloud的API清单](uniCloud/cf-functions.html#unicloud-api%E5%88%97%E8%A1%A8)
与云函数入参时的`context`不同,云对象没有`context`。除上述API之外,云对象的this对象还有一批专用方法来获取当前请求的上下文信息。
除上述API之外,云对象的this对象还有一批专用方法来获取当前请求的上下文信息。
与云函数入参时的`context`不同,云对象没有`context`。它通过this对象挂载的几个内置方法来获取上下文信息。请注意开发者避免在this上挂载同名方法。
### 获取客户端信息@get-client-info
......@@ -229,14 +231,10 @@ module.exports = {
add: function() {
const clientInfo = this.getClientInfo()
// clientInfo = {
// os,
// appId,
// locale,
// clientIP,
// userAgent,
// platform,
// appId,
// deviceId,
// uniIdToken,
// ua,
// //... 其他getSystemInfoSync返回值
// }
}
......@@ -245,18 +243,9 @@ module.exports = {
**返回值**
|参数名 |类型 |必备 |说明 |
|-- |-- |-- |-- |
|os |string |是 |客户端系统 |
|appId |string |是 |客户端DCloud AppId |
|locale |string |是 |客户端语言 |
|clientIP |string |是 |客户端ip |
|userAgent |string |是 |客户端ua |
|platform |string |是 |客户端平台,app,mp-weixin等 |
|deviceId |string |是 |客户端deviceId,目前同getSystemInfo内的deviceId|
|uniIdToken |string |是 |客户端用户token |
getClientInfo返回的信息,是在客户端的[uni.getSystemInfo](https://uniapp.dcloud.net.cn/api/system/info.html#getsysteminfo)的基础之上,增加了`clientIP`,即客户端IP。
除了`clientIP`,返回的其他字段请参考[uni.getSystemInfo](https://uniapp.dcloud.net.cn/api/system/info.html#getsysteminfo)
**注意**
......@@ -286,11 +275,13 @@ module.exports = {
|参数名 |类型 |必备 |说明 |
|-- |-- |-- |-- |
|provider |string |是 |服务空间供应商 |
|provider |string |是 |服务空间供应商,阿里云为aliyun,腾讯云为tcb|
|spaceId |string |是 |服务空间Id |
### 获取客户端token@get-uni-id-token
云对象自动管理`uni-id`的token。开发者无需手动管理。如果不了解`uni-id`,请[参考](/uniCloud/uni-id-summary)
**接口形式**
`this.getUniIdToken()`
......@@ -301,10 +292,14 @@ module.exports = {
module.exports = {
add: function(){
const token = this.getUniIdToken()
if(!token) {
// 登录状态无效
}
}
}
```
### 获取当前调用的方法名@get-method-name
本方法主要用于在`_before`等拦截器方法里,判断客户端上传的信息进行处理,比如发现客户端调用的是a方法时,执行一段特殊逻辑。详见下文的[预处理](uniCloud/cloud-obj?id=before-and-after)
......@@ -345,9 +340,9 @@ module.exports = {
### 预处理 _before@before
云对象内可以创建一个特殊的方法_before,用来在调用常规方法之前进行预处理,一般用于拦截器、统一的身份验证、参数校验等。
云对象内可以创建一个特殊的方法`_before`,用来在调用常规方法之前进行预处理,一般用于拦截器、统一的身份验证、参数校验等。
以下示例的逻辑是,当客户端调用todo云对象的add方法时,会先执行_before方法中的逻辑,判断为add方法时校验了客户端token,校验失败则直接报错返回客户端,校验通过继续执行add方法。
以下示例的逻辑是,当客户端调用todo云对象的add方法时,会先执行`_before`方法中的逻辑,判断为add方法时校验了客户端token,校验失败则直接报错返回客户端,校验通过继续执行add方法。
```js
// todo/index.obj.js
......@@ -398,27 +393,42 @@ module.exports = {
}
```
注意:所有`_`开头的方法都是私有方法,客户端不可访问。也就是客户端调用云对象时不能调用_开头的方法。
## 云对象的返回值@return-value
客户端拿到云对象的响应结果后,会自动进行结果的处理。
云对象返回给客户端的数据,包括正常数据和错误对象。
理论上,开发者可以使用任意方式返回正确状态下的数据格式,返回字符串、json对象都可以。
但在错误处理时,推荐使用[uniCloud响应体规范](uniCloud/cf-functions.md?id=resformat),以方便客户端统一拦截错误。
在云对象内部报错时,比如方法名错误等非开发者代码返回的错误,会自动使用[uniCloud响应体规范](uniCloud/cf-functions.md?id=resformat)抛出错误对象。
- 如果是正常的结果(errCode为假值[0, false, null, undefined, ...]或者结果内不含errCode)则将结果直接返回
- 如果是报错的结果(errCode为真值)将结果内的errCode和errMsg组合为错误对象抛出
- 如果是其他云函数未捕获的错误,直接将错误码和错误信息组合成错误对象抛出
开发者代码在主动报错时,比如参数校验错误,由于不能直接写入错误对象(e),则需要按照[uniCloud响应体规范](uniCloud/cf-functions.md?id=resformat)在返回的json对象中加入`errCode``errMsg`
前端抛出的错误对象上有以下属性
uni-app客户端拿到云对象的响应结果后,会识别其中是否包含`errCode``errMsg`,然后自动创建报错对象(e),策略如下:
- 如果是正常的结果(errCode为假值[0, false, null, undefined, ...]或者结果内不含errCode),不抛出错误对象(e)
- 如果是报错的结果(errCode为真值)将结果内的errCode和errMsg组合为错误对象(e)抛出
- 如果是其他云函数未捕获的错误,直接将错误码和错误信息组合成错误对象(e)抛出
也就是说,开发者的前端代码调用云对象时,需要try catch。不报错时,在`try`里直接返回结果,报错时在`catch (e) {}`里拿到错误对象e。
客户端抛出的错误对象(e)有以下属性
|属性名 |类型 |是否必备 |说明 |
|-- |-- |-- |-- |
|errCode |string&#124;number |否 |错误码 |
|errMsg |string |否 |错误信息 |
|requestId |string |否 |当前请求的requestId |
|detail |Object |否 |完成的错误响应(仅在响应符合uniCloud响应体规范时才有) |
|requestId |string |否 |当前请求的requestId。本地调试无此值,需在服务空间运行 |
|detail |Object |否 |完整的错误响应(仅在响应符合uniCloud响应体规范时才有) |
详见以下示例:
```js
// todo/index.obj.js
// 云对象代码 todo/index.obj.js
module.exports = {
add: async function(title = '', content = '') {
title = title.trim()
......@@ -436,11 +446,14 @@ module.exports = {
}
}
}
```
```js
// 客户端代码
const todo = uniCloud.importObject('todo')
// 不传title、content,云函数返回错误的响应
try {
// 不传title、content,云函数返回错误的响应
await todo.add()
} catch (e) {
// e.errCode === 'INVALID_TODO'
......@@ -449,6 +462,7 @@ try {
// e.requestId === 'xxxx'
}
// 传入正确的title、content,云函数返回原始响应
try {
const res = await todo.add('title demo', 'content demo')
// res = {errCode: 0,errMsg: '创建成功'}
......@@ -568,7 +582,11 @@ module.exports = {
- 云对象和云函数都在cloudfunctions目录下,但是不同于云函数,云对象的入口为`index.obj.js`,而云函数则是`index.js`**为正确区分两者uniCloud做出了限制,云函数内不可存在index.obj.js,云对象内也不可存在index.js。**
- 所有`_`开头的方法都是私有方法,客户端不可访问
- 云对象也可以引用公共模块或者npm上的包,引用方式和云函数完全一致。
- 云对象也可以引用公共模块或者npm上的包,引用方式和云函数一致。
## 复杂示例
DCloud官方开发了 `uni-id-co`,这是一个较为复杂的云对象,用于搭配 [uni-id-pages](https://ext.dcloud.net.cn/plugin?id=8577) 实现云端一体的用户注册登录等功能。该代码开源,可以参考。
## 推荐最佳实践
......@@ -578,4 +596,6 @@ uniCloud的服务器和客户端交互,有云函数、云对象、clientDB三
如果是以数据库操作为主,则推荐使用clientDB,开发效率是最高的。
如果服务器端除了操作数据库外,还有复杂的、不宜公开在前端的逻辑,此时推荐使用云对象。
\ No newline at end of file
如果服务器端不操作数据库外,或者还有复杂的、不宜公开在前端的逻辑,此时推荐使用云对象。
但云对象仅适用于与uni-app前端交互使用。如果不与uni-app前端交互,比如使用云函数URL化与其他系统通信、或者使用定时云函数,此时不适用云对象,还是需要使用云函数。
\ No newline at end of file
云函数即在云端(服务器端)运行的函数。
开发者无需购买、搭建服务器,只需编写函数代码并部署到云端即可在客户端(App/H5/小程序等)调用,同时云函数之间也可互相调用。
从 HBuilderX 3.4起,新增了云函数的扩展版,云对象。
开发者无需购买、搭建服务器,只需编写代码并部署到云端即可在客户端(App/Web/小程序等)调用,同时云函数之间也可互相调用。
一个云函数的写法与一个在本地定义的 `JavaScript` 方法无异,代码运行在云端 `Node.js` 中。当云函数被客户端调用时,定义的代码会被放在 `Node.js` 运行环境中执行。
开发者可以如在 `Node.js` 环境中使用 `JavaScript` 一样在云函数中进行网络请求等操作,而且还可以通过云函数服务端 SDK 搭配使用多种服务,比如使用云函数 SDK 中提供的数据库和存储 API 进行数据库和存储的操作,这部分可参考数据库和存储后端 API 文档
开发者可以如在 `Node.js` 环境中使用 `JavaScript` 一样在云函数中进行网络请求等操作,也可以使用 node_modules
但 DCloud提供了 uniCloud对象 内置在云函数/云对象中,开发者使用更多的是 uniCloud 的 api,不了解 node 不影响开发。
HBuilderX 3.0起版本,在`uniCloud/cloudfunctions`目录右键创建云函数,如下:
......@@ -14,15 +17,11 @@ HBuilderX 3.0起版本,在`uniCloud/cloudfunctions`目录右键创建云函数
<img style="max-width:750px;" src="https://bjetxgzv.cdn.bspapp.com/VKCEYUGU-dc-site/a18b3bb0-53d8-11eb-8ff1-d5dcf8779628.jpg"/>
</div>
在HBuilderX 3.4起,上述界面更新为 新建云函数/云对象。
HBuilderX 3.0之前版本,在项目下的`cloudfunctions`目录上右键、新建云函数,如下:
<div align=center>
<img style="max-width:750px;" src="https://img.cdn.aliyun.dcloud.net.cn/uni-app/uniCloud/unicloud-02.png"/>
</div>
云对象本质是对云函数的一种封装,可以对象化的方式使用云服务。
注:从HBuilderX 3.0起,`cloudfunctions`目录位于项目下的 `uniCloud` 目录下。
HBuilderX 3.0之前版本,项目下没有`uniCloud`目录,直接在`cloudfunctions`目录上右键、新建云函数
云函数修改后,可以本地运行。只有上传到云端,方可在云端生效。
......
`uniCloud`提供了一个 JSON 格式的文档型数据库,数据库中的每条记录都是一个 JSON 格式的对象。一个数据库可以有多个集合(相当于关系型数据中的表),集合可看做一个 JSON 数组,数组中的每个对象就是一条记录,记录的格式是 JSON 对象。
`uniCloud` 提供了 2 个 nosql 数据库。
- JSON文档型云数据库
uniCloud阿里云版的云数据库就是 MongoDB 的 serverless版;uniCloud腾讯云版的云数据库是兼容 MongoDB 的自研数据库。
数据库中的每条记录都是一个 JSON 格式的对象。
一个数据库可以有多个集合(相当于关系型数据中的表),集合可看做一个 JSON 数组,数组中的每个对象就是一条记录,记录的格式是 JSON 对象。
这对于js工程师而言,非常容易理解掌握。
MongoDB的传统操作方法还是比较复杂,uniCloud提供了更多简单操作数据库的方案,包括类似 SQL 的 JQL 语法、clientDB等技术。
在uniCloud中,云数据库、MongoDB数据库,这些概念一般都是指这个数据库,更多云数据库介绍[参考](uniCloud/hellodb.md)
更多云数据库介绍参考[规范](uniCloud/hellodb.md)
- redis 数据库
redis 是一种可以运行在内存中的键值对数据库,它的能力没有MongoDB强大,但由于可运行在内存中,它的性能远超常规数据库。
redis 也使用 json 方式 key/value 键值对存储数据。更多文档[参考](redis.md)
如果开发者需要其他数据库,比如 mysql、ElasticSearch、数据湖,这些数据库没有在uniCloud的服务空间内置,云函数中通过 nodejs 的 api 可以访问这些远程数据库。
如果是业务方面的mysql,建议通过uniCloud web控制台数据导入或通过云函数将mysql数据导入到uniCloud的云数据库中,这样速度比连接远程mysql数据库要更快,
并且可以使用jql、clientDB等一系列uniCloud提供的数据库操作技术,uniCloud庞大的生态如uni-id、uni-admin也都只支持uniCloud云数据库。
如果是 es搜索、大数据分析,则应该通过云函数中 nodejs API 远程连接这些数据库使用。
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册