提交 718b2a1d 编写于 作者: 雪洛's avatar 雪洛

docs: uniCloud

上级 6c98deae
...@@ -1820,7 +1820,7 @@ let res = await db.collection('user').where({ ...@@ -1820,7 +1820,7 @@ let res = await db.collection('user').where({
事务通常用来在某个数据库操作失败之后进行回滚。 事务通常用来在某个数据库操作失败之后进行回滚。
> 事务因为要锁行,是有时间限制的。从事务开始到事务提交/回滚,时间不可超过10s。另外注意:如果多条事务同时处理同一行数据,可能存在写冲突,进而导致失败。 > 事务因为要锁行,是有时间限制的。从事务开始到事务提交/回滚,时间不可超过10。另外注意:如果多条事务同时处理同一行数据,可能存在写冲突,进而导致失败。
### runTransaction@run-transaction ### runTransaction@run-transaction
......
...@@ -336,11 +336,11 @@ let callFunctionResult = await uniCloud.callFunction({ ...@@ -336,11 +336,11 @@ let callFunctionResult = await uniCloud.callFunction({
## 云函数配置 ## 云函数配置
### 超时时间 ### 超时时间@timeout
**注意** 阿里云非定时触发请求云函数最大只支持10秒的超时时间。定时触发最大支持600秒的超时时间
- 目前阿里云的超时时间和腾讯云有区别,如果在阿里云云函数运行超过10秒那么客户端没法同步接收返回结果,但是云函数仍会运行到配置的超时时间。腾讯云在云函数运行到配置的超时时间之前客户端都是可以收到返回结果的。 腾讯云最大支持900秒超时时间
### 固定出口IP@eip ### 固定出口IP@eip
...@@ -572,7 +572,7 @@ cloudfunction-config说明如下 ...@@ -572,7 +572,7 @@ cloudfunction-config说明如下
{ {
"fun-name": { // 云函数名称 "fun-name": { // 云函数名称
"memorySize": 256, // 函数的最大可用内存,单位MB,可选值: 128|256|512|1024|2048,默认值256 "memorySize": 256, // 函数的最大可用内存,单位MB,可选值: 128|256|512|1024|2048,默认值256
"timeout": 5, // 函数的超时时间,单位秒,默认值5最长为60秒,阿里云在定时触发时最长可以是600 "timeout": 5, // 函数的超时时间,单位秒,默认值5
// triggers 字段是触发器数组,目前仅支持一个触发器,即数组只能填写一个,不可添加多个 // triggers 字段是触发器数组,目前仅支持一个触发器,即数组只能填写一个,不可添加多个
"triggers": [{ "triggers": [{
// name: 触发器的名字,规则见https://uniapp.dcloud.net.cn/uniCloud/trigger,name不对阿里云生效 // name: 触发器的名字,规则见https://uniapp.dcloud.net.cn/uniCloud/trigger,name不对阿里云生效
...@@ -678,6 +678,4 @@ exports.main = async function() { ...@@ -678,6 +678,4 @@ exports.main = async function() {
### 其它 ### 其它
- 云端的云函数中使用的时区是 `UTC+0`,而不是 `UTC+8`,在云函数中使用时间时需特别注意。云函数在HBuilderX本地运行时,时区则是电脑的时区,很可能是 `UTC+8`。建议使用时间戳,可以规避时区问题。 - 云端的云函数中使用的时区是 `UTC+0`,而不是 `UTC+8`,在云函数中使用时间时需特别注意。云函数在HBuilderX本地运行时,时区则是电脑的时区,很可能是 `UTC+8`。建议使用时间戳,可以规避时区问题。
- 使用阿里云作为服务商时,暂时无法使用相对路径读取文件,如:`fs.readFileSync('./info')`,可以替换为`fs.readFileSync(path.resolve(__dirname,'./info'))`
- 阿里云目前能同步返回数据的最大超时时间为10秒,即云函数运行超过10秒时客户端会收到超时报错。如果你在uniCloud web控制台配置了10秒以上的超时时间,云函数是可以运行到10秒以上的,只是客户端无法接收到返回值,腾讯云没有此限制。
...@@ -23,9 +23,11 @@ uniCloud分为客户端和云端两部分,有些接口名称相同,参数也 ...@@ -23,9 +23,11 @@ uniCloud分为客户端和云端两部分,有些接口名称相同,参数也
解析客户端token获取用户信息。常用于在前端判断当前登录的用户状态和用户权限,比如根据不同的权限显示隐藏某些按钮。 解析客户端token获取用户信息。常用于在前端判断当前登录的用户状态和用户权限,比如根据不同的权限显示隐藏某些按钮。
注意:不会发送网络请求,**注意这个仅仅是客户端接口,不校验token的合法性** **注意**
注意:需要搭配uni-id使用并要求客户端必须将token存储在storage内的`uni_id_token` - 此接口不会发送网络请求,**此接口仅仅是客户端接口,不校验token的合法性**
- 需要搭配uni-id使用并要求客户端必须将token存储在storage内的`uni_id_token`
- 如需获取role、permission需要将角色权限缓存在token内,此功能自uni-id 3.0.0其默认开启,参考:[缓存角色权限](uniCloud/uni-id.md?id=cache-permission-in-token)
用法:`uniCloud.getCurrentUserInfo()` 用法:`uniCloud.getCurrentUserInfo()`
...@@ -33,11 +35,11 @@ uniCloud分为客户端和云端两部分,有些接口名称相同,参数也 ...@@ -33,11 +35,11 @@ uniCloud分为客户端和云端两部分,有些接口名称相同,参数也
**响应参数** **响应参数**
| 字段 | 类型 | 说明 | | 字段 | 类型 | 说明 |
| --- | --- | --- | | --- | --- | --- |
| uid | Number|当前用户uid | | uid | Number|当前用户uid |
| role | Array |用户角色列表。admin用户返回["admin"] | | role | Array |用户角色列表。admin用户返回["admin"] |
| permission | Array |用户权限列表。注意admin角色此数组为空| | permission| Array |用户权限列表。注意admin角色此数组为空|
未能获取用户信息时返回以下结果 未能获取用户信息时返回以下结果
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
**注意** **注意**
- `clientDB`依赖uni-id(`1.1.10+版本`)提供用户身份和权限校验,如果你不了解uni-id,请参考[uni-id文档](https://uniapp.dcloud.net.cn/uniCloud/uni-id) - `clientDB`依赖uni-id(`1.1.10+版本`)提供用户身份和权限校验,如果你不了解uni-id,请参考[uni-id文档](https://uniapp.dcloud.net.cn/uniCloud/uni-id)
- `clientDB`依赖的uni-id需要在uni-id的config.json内添加uni-id相关配置,通过uni-id的init方法传递的参数不会对clientDB生效 - `clientDB`依赖的uni-id需要在uni-id的config.json内添加uni-id相关配置,通过uni-id的init方法传递的参数不会对clientDB生效,参考:[uni-id 配置](uniCloud/uni-id.md?id=config)
- 通常在管理控制台使用`clientDB`,需要获取不同角色用户拥有的权限(在权限规则内使用auth.permission),请先查阅[uni-id 角色权限](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=rbac) - 通常在管理控制台使用`clientDB`,需要获取不同角色用户拥有的权限(在权限规则内使用auth.permission),请先查阅[uni-id 角色权限](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=rbac)
## 对比:传统与clientDB云端协同的开发效率 ## 对比:传统与clientDB云端协同的开发效率
...@@ -59,7 +59,7 @@ js API可以执行所有数据库操作。`<unicloud-db>`组件是js API的再 ...@@ -59,7 +59,7 @@ js API可以执行所有数据库操作。`<unicloud-db>`组件是js API的再
- 在HBuilderX 3.0+,`<unicloud-db>`组件已经内置,可以直接使用。文档另见:[`<unicloud-db>`组件](/uniCloud/unicloud-db) - 在HBuilderX 3.0+,`<unicloud-db>`组件已经内置,可以直接使用。文档另见:[`<unicloud-db>`组件](/uniCloud/unicloud-db)
- 在HBuilderX 3.0以前的版本,使用该组件需要在插件市场单独引用`<uni-clientDB>插件`,另见:[https://ext.dcloud.net.cn/plugin?id=3256](https://ext.dcloud.net.cn/plugin?id=3256) - 在HBuilderX 3.0以前的版本,使用该组件需要在插件市场单独引用`<uni-clientDB>插件`,另见:[https://ext.dcloud.net.cn/plugin?id=3256](https://ext.dcloud.net.cn/plugin?id=3256)
以下文章重点介绍`clientDB`的js API。至于组件的用法,另见[文档](/uniCloud/unicloud-db) 以下文章重点介绍`clientDB`的js API。至于组件的用法,另见[文档](uniCloud/unicloud-db.md)
## clientDB前端API@jssdk ## clientDB前端API@jssdk
...@@ -87,6 +87,23 @@ db.collection('list') ...@@ -87,6 +87,23 @@ db.collection('list')
}) })
``` ```
**jql查询语法示例**
```js
// 获取db引用
const db = uniCloud.database() //代码块为cdb
// 使用uni-clientDB
db.collection('list')
.where('name=="hello-uni-app"')
.get()
.then((res)=>{
// res 为数据库查询结果
}).catch((err)=>{
console.log(err.code); // 打印错误码
console.log(err.message); // 打印错误内容
})
```
**使用说明** **使用说明**
前端操作数据库的语法与云函数一致,但有以下限制(使用jql语法时也一样): 前端操作数据库的语法与云函数一致,但有以下限制(使用jql语法时也一样):
...@@ -94,9 +111,9 @@ db.collection('list') ...@@ -94,9 +111,9 @@ db.collection('list')
- 上传时会对query进行序列化,除Date类型、RegExp之外的所有不可序列化的参数类型均不支持(例如:undefined) - 上传时会对query进行序列化,除Date类型、RegExp之外的所有不可序列化的参数类型均不支持(例如:undefined)
- 为方便控制权限,禁止前端使用set方法,一般情况下也不需要前端使用set - 为方便控制权限,禁止前端使用set方法,一般情况下也不需要前端使用set
- 更新数据库时不可使用更新操作符`db.command.inc` - 更新数据库时不可使用更新操作符`db.command.inc`
- 更新数据时键值不可使用`{'a.b.c': 1}`的形式,需要写成`{a:{b:{c:1}}}`形式(后续会对此进行优化) - 更新数据时键值不可使用`{'a.b.c': 1}`的形式,需要写成`{a:{b:{c:1}}}`形式
### err返回值说明@returnvalue ### 返回值说明@returnvalue
`clientDB`如果云端返回错误,err的返回值形式如下, `clientDB`如果云端返回错误,err的返回值形式如下,
...@@ -291,7 +308,7 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型 ...@@ -291,7 +308,7 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
```html ```html
<uni-clientdb v-slot:default="{loading, data, error, options}" :options="options" <uni-clientdb v-slot:default="{loading, data, error, options}" :options="options"
collection="list" where='name == "hello-uni-app"' :getone="true"> collection="list" where="name == 'hello-uni-app'" :getone="true">
<view v-if="error" class="error">{{error}}</view> <view v-if="error" class="error">{{error}}</view>
<view v-else> <view v-else>
{{item.name}} {{item.name}}
...@@ -330,9 +347,10 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型 ...@@ -330,9 +347,10 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
具体到这个正则 `/abc/.test(content)`,类似于sql中的`content like '%abc%'`,即查询所有字段content包含abc的数据记录。 具体到这个正则 `/abc/.test(content)`,类似于sql中的`content like '%abc%'`,即查询所有字段content包含abc的数据记录。
**注意:不支持非操作** **注意**
**注意编写查询条件时,除test外,均为运算符左侧为数据库字段,右侧为常量** - 不支持非操作
- 编写查询条件时,除test外,均为运算符左侧为数据库字段,右侧为常量
#### 查询数组字段@querywitharr #### 查询数组字段@querywitharr
...@@ -365,7 +383,7 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型 ...@@ -365,7 +383,7 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
<template> <template>
<view class="content"> <view class="content">
<input @input="onKeyInput" placeholder="请输入搜索值" /> <input @input="onKeyInput" placeholder="请输入搜索值" />
<unicloud-db v-slot:default="{data, loading, error, options}" collection="goods" :where=`${new RegExp(searchVal, 'i')}.test(name)`> <unicloud-db v-slot:default="{data, loading, error, options}" collection="goods" :where="where">
<view v-if="error">{{error.message}}</view> <view v-if="error">{{error.message}}</view>
<view v-else> <view v-else>
...@@ -381,8 +399,13 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型 ...@@ -381,8 +399,13 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
searchVal: '' searchVal: ''
} }
}, },
computed: {
where() {
return `${new RegExp(searchVal, 'i')}.test(name)` // 使用计算属性得到完整where
}
},
methods: { methods: {
onKeyInput(e){ onKeyInput(e) {
// 实际开发中这里应该还有防抖或者节流操作,这里不做演示 // 实际开发中这里应该还有防抖或者节流操作,这里不做演示
this.searchVal = e.target.value this.searchVal = e.target.value
} }
...@@ -406,6 +429,19 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型 ...@@ -406,6 +429,19 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
只需在db schema中,将两个表的关联字段建立映射关系,就可以把2个表当做一个虚拟表来直接查询。 只需在db schema中,将两个表的关联字段建立映射关系,就可以把2个表当做一个虚拟表来直接查询。
JQL联表查询有以下两种写法:
```js
// 直接关联多个表为虚拟表再进行查询
const res = await db.collection('order,book').where('_id=="1"').get() // 直接关联order和book之后再过滤
// 使用getTemp先过滤处理再联表查询
const order = db.collection('order').where('_id=="1"').getTemp() // 注意结尾的方法是getTemp,对order表过滤得到临时表
const res = await db.collection(order, 'book').get() // 将获取的order表的临时表和book表进行联表查询
```
上面两种写法最终结果一致,但是第二种写法性能更好。第一种写法会先将所有数据进行关联,如果数据量很大这一步会消耗浪费很多时间。详细示例见下方说明
**关联查询后的虚拟表数据结构如下:** **关联查询后的虚拟表数据结构如下:**
> 通过HBuilderX提供的[JQL数据库管理](uniCloud/jql-runner.md)功能方便的查看联表查询时的虚拟表结构 > 通过HBuilderX提供的[JQL数据库管理](uniCloud/jql-runner.md)功能方便的查看联表查询时的虚拟表结构
...@@ -715,7 +751,7 @@ db.collection('comment,user') ...@@ -715,7 +751,7 @@ db.collection('comment,user')
**注意** **注意**
- 联表查询时关联字段会被替换成被关联表的内容,因此不可在where内使用关联字段作为条件。举个例子,在上面的示例`where({book_id:"1"})`,但是可以使用`where({'book_id._id':"1"})` - 联表查询时关联字段会被替换成被关联表的内容,因此不可在where内使用关联字段作为条件。举个例子,在上面的示例中,`where({book_id:"1"})`是无法筛选出正确结果的,但是可以使用`where({'book_id._id':"1"})`
- 上述示例中如果order表的`book_id`字段是数组形式存放多个book_id,也跟上述写法一致,clientDB会自动根据字段类型进行联表查询 - 上述示例中如果order表的`book_id`字段是数组形式存放多个book_id,也跟上述写法一致,clientDB会自动根据字段类型进行联表查询
- 各个表的_id字段会默认带上,即使没有指定返回 - 各个表的_id字段会默认带上,即使没有指定返回
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
keyword: 短信,sms keyword: 短信,sms
--> -->
> 自HBuilderX 3.3.0-alpha起,本接口支持传入phoneList参数批量发送短信,其他参数均于发送单条短信相同 > 自`HBuilderX 3.3.0`起,本接口支持传入phoneList参数批量发送短信,其他参数均于发送单条短信相同
自HBuilderX 2.8.1起,uniCloud内置了短信发送API。给开发者提供更方便、更便宜的短信发送能力。 自HBuilderX 2.8.1起,uniCloud内置了短信发送API。给开发者提供更方便、更便宜的短信发送能力。
...@@ -27,7 +27,7 @@ keyword: 短信,sms ...@@ -27,7 +27,7 @@ keyword: 短信,sms
|smsKey |String |是 |调用短信接口的密钥key,从 dev.dcloud.net.cn/uniSms 后台获取 | |smsKey |String |是 |调用短信接口的密钥key,从 dev.dcloud.net.cn/uniSms 后台获取 |
|smsSecret |String |是 |调用短信接口的密钥secret,从 dev.dcloud.net.cn/uniSms 后台获取 | |smsSecret |String |是 |调用短信接口的密钥secret,从 dev.dcloud.net.cn/uniSms 后台获取 |
|phone |String |和phoneList二选一|发送目标手机号,暂仅支持中国大陆手机号 | |phone |String |和phoneList二选一|发送目标手机号,暂仅支持中国大陆手机号 |
|phoneList |Array |和phone二选一 |发送目标手机号,暂仅支持中国大陆手机号,最多50个手机号码 | |phoneList |Array |和phone二选一 |发送目标手机号,暂仅支持中国大陆手机号,最多50个手机号码`HBuilderX 3.3.0`起支持 |
|templateId |String |是 |模版Id,短信内容为固定模板,详见下方说明(应用开发阶段,可以使用 DCloud 提供的测试模板) | |templateId |String |是 |模版Id,短信内容为固定模板,详见下方说明(应用开发阶段,可以使用 DCloud 提供的测试模板) |
|data |Object |是 |模版里的各个变量字段,json格式 | |data |Object |是 |模版里的各个变量字段,json格式 |
......
...@@ -111,7 +111,7 @@ DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及微博 ...@@ -111,7 +111,7 @@ DCloud暂无计划开发百度、头条、QQ等小程序的登录,以及微博
注意: 注意:
- **config.json是一个标准json文件,不支持注释** - **config.json是一个标准json文件,不支持注释**
- 如果不希望使用config.json初始化而是想自行传入参数(一般不推荐这么做),可以使用`init`方法[uniID.init](/uniCloud/uni-id?id=init) - 如果不希望使用config.json初始化而是想自行传入参数(一般不推荐这么做),可以使用`createInstance`方法[uniID.createInstance](uniCloud/uni-id.md?id=create-instance)
> 在云函数URL化的场景无法获取客户端平台信息,可以在调用uni-id相关接口之前(推荐在云函数入口)通过修改context.PLATFORM手动传入客户端平台信息 > 在云函数URL化的场景无法获取客户端平台信息,可以在调用uni-id相关接口之前(推荐在云函数入口)通过修改context.PLATFORM手动传入客户端平台信息
...@@ -233,6 +233,16 @@ tokenExpiresThreshold用于指定token还有多长时间过期时自动刷新tok ...@@ -233,6 +233,16 @@ tokenExpiresThreshold用于指定token还有多长时间过期时自动刷新tok
- [保存token及其过期时间](uniCloud/uni-id?id=save-token) - [保存token及其过期时间](uniCloud/uni-id?id=save-token)
- [删除token及其过期时间](uniCloud/uni-id?id=remove-token) - [删除token及其过期时间](uniCloud/uni-id?id=remove-token)
用户token为明文存储,可以在token内查看用户相关信息。uniCloud也提供了一个接口用于直接获取token内的用户信息,参考:[uniCloud.getUserInfo](uniCloud/client-sdk.md?id=client-getcurrentuserinfo)
uniCloud.getUserInfo接口大致逻辑如下,需要注意的是某些小程序平台不支持atob,getUserInfo接口内已包含atob的polyfill
```js
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiI2MWE1OTNiYTkxYTc1MDAwMDE2NmY3OGQiLCJyb2xlIjpbImFkbWluIl0sInBlcm1pc3Npb24iOltdLCJpYXQiOjE2MzgyNDMzNjUsImV4cCI6MTYzODI1MDU2NX0.MRHEvNYhj9yXjPK04rhZOdnitaxRdF2Ek9BbZjPJyDE'
const userSegment = token.split('.')[1]
const userInfo = atob(userSegment) // '{"uid":"61a593ba91a750000166f78d","role":["admin"],"permission":[],"iat":1638243365,"exp":1638250565}'
```
# 用户角色权限@rbac # 用户角色权限@rbac
为什么需要角色权限管理? 为什么需要角色权限管理?
...@@ -424,12 +434,11 @@ CreateInstanceParams内可以传入云函数context ...@@ -424,12 +434,11 @@ CreateInstanceParams内可以传入云函数context
// 云函数代码 // 云函数代码
const uniID = require('uni-id') const uniID = require('uni-id')
exports.main = async function(event,context) { exports.main = async function(event,context) {
context.APPID = '__UNI__xxxxxxx' // 替换为当前客户端的APPID,通过客户端callFunction请求的场景可以使用context.APPID获取
context.PLATFORM = 'h5' // 替换为当前客户端的平台类型,通过客户端callFunction请求的场景可以使用context.PLATFORM获取
context.LOCALE = 'zh-Hans' // 替换为当前客户端的语言代码,通过客户端callFunction请求的场景可以使用context.LOCALE获取
const uniIDIns = uniID.createInstance({ // 创建uni-id实例,其上方法同uniID const uniIDIns = uniID.createInstance({ // 创建uni-id实例,其上方法同uniID
context: { context: context,
APPID: '__UNI__xxxxxxx', // 替换为当前客户端的APPID,非url化的场景可以使用context.APPID获取
PLATFORM: 'h5', // 替换为当前客户端的平台类型,非url化的场景可以使用context.PLATFORM获取
LOCALE: 'zh-cn' // 替换为当前客户端的语言代码,非url化的场景可以使用context.LOCALE获取
},
// config: {} // 完整uni-id配置信息,使用config.json进行配置时无需传此参数 // config: {} // 完整uni-id配置信息,使用config.json进行配置时无需传此参数
}) })
payload = await uniIDIns.checkToken(event.uniIdToken) // 后续使用uniIDIns调用相关接口 payload = await uniIDIns.checkToken(event.uniIdToken) // 后续使用uniIDIns调用相关接口
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册