提交 47cb9407 编写于 作者: 雪洛's avatar 雪洛

docs: uniCloud doc review

上级 a83bc1fb
......@@ -12,7 +12,7 @@
* [数据库索引](uniCloud/db-index.md)
* [前端操作数据库的API及JQL语法](uniCloud/clientdb.md)
* [unicloud-db前端组件](uniCloud/unicloud-db.md)
* [JQL查询调试器](uniCloud/jql-runner.md)
* [JQL数据库管理](uniCloud/jql-runner.md)
* [openDB](https://gitee.com/dcloud/opendb)
* [性能优化](uniCloud/db-performance.md)
* 云函数
......
......@@ -201,6 +201,33 @@ console.log(res)
}
}
```
**发送formdata类型数据**
实际业务中常有使用云函数发送formdata类型数据的需求,比如微信小程序提供的一些服务端接口(图片内容安全检测、识别图片二维码等),可以参考以下示例进行发送
```js
'use strict';
const fs = require('fs')
const path = require('path')
const FormData = require('form-data'); // 此form-data需要使用npm安装,地址:https://www.npmjs.com/package/form-data
exports.main = async (event, context) => {
const form = new FormData()
form.append('media', fs.readFileSync(path.resolve(__dirname, './test.jpg')), { // 为方便演示此处直接使用云函数目录下的test.jpg文件
filename: 'test.jpg',
contentType: 'image/jpeg'
});
form.append('otherParam', 'otherParam content');
const res = await uniCloud.httpclient.request('https://httpbin.org/post', {
method: 'POST',
content: form.getBuffer(), // 请求内容
headers: form.getHeaders(), // 请求头
dataType: 'json' // 此处指定为json表示将此请求的返回值解析为json
})
return res
};
```
## 使用npm
......
......@@ -265,7 +265,7 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
```js
const db = uniCloud.database()
// 上面的示例中的where条件可以使用以下写法
// 使用`jql`查询list表内`name`字段值为`hello-uni-app`的记录
db.collection('list')
.where('name == "hello-uni-app"')
.get()
......@@ -295,11 +295,11 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
以下变量同[前端环境变量](uniCloud/database.md?id=variable)
|参数名 |说明 |
|:-: |:-: |
|$env.uid |用户uid,依赖uni-id|
|$env.now |服务器时间戳 |
|$env.clientIP|当前客户端IP |
|参数名 |说明 |
|:-: |:-: |
|$cloudEnv_uid |用户uid,依赖uni-id|
|$cloudEnv_now |服务器时间戳 |
|$cloudEnv_clientIP |当前客户端IP |
**jql条件语句的运算符**
......@@ -321,8 +321,6 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
具体到这个正则 `/abc/.test(content)`,类似于sql中的`content like '%abc%'`,即查询所有字段content包含abc的数据记录。
**云函数中node版本为8.9不支持正则断言**
**注意编写查询条件时,除test外,均为运算符左侧为数据库字段,右侧为常量**
#### 查询数组字段@querywitharr
......@@ -391,7 +389,7 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
### JQL联表查询@lookup
> clientDB将于2021年4月26日优化联表查询策略,详情参考:[联表查询策略调整](https://ask.dcloud.net.cn/article/38966)
> clientDB于2021年4月28日优化了联表查询策略,详情参考:[联表查询策略调整](https://ask.dcloud.net.cn/article/38966)
`JQL`提供了更简单的联表查询方案。不需要学习join、lookup等复杂方法。
......@@ -601,6 +599,15 @@ db.collection('order')
不止js,`<unicloud-db>`组件也支持所有`jql`功能,包括联表查询。
在前端页面调试JQL联表查询且不过滤字段时会受权限影响,导致调试比较困难。可以通过HBuilderX提供的[JQL数据库管理](uniCloud/jql-runner.md)功能方便的查看联表查询时的虚拟表结构。
如上述查询可以直接在`JQL文件`中执行以下代码查看完整的虚拟表字段
```js
db.collection('order,book').get()
```
#### 手动指定使用的foreignKey@lookup-foreign-key
如果存在多个foreignKey且只希望部分生效,可以使用foreignKey来指定要使用的foreignKey
......@@ -617,7 +624,6 @@ db.collection('comment,user')
**注意**
- field参数字符串内没有冒号
- 联表查询时关联字段会被替换成被关联表的内容,因此不可在where内使用关联字段作为条件。举个例子,在上面的示例,`where({book_id:"1"})`,但是可以使用`where({'book_id._id':"1"})`
- 上述示例中如果order表的`book_id`字段是数组形式存放多个book_id,也跟上述写法一致,clientDB会自动根据字段类型进行联表查询
- 各个表的_id字段会默认带上,即使没有指定返回
......@@ -631,6 +637,8 @@ db.collection('comment,user')
**关联查询后的数据结构如下:**
> 通过HBuilderX提供的[JQL数据库管理](uniCloud/jql-runner.md)功能方便的查看联表查询时的虚拟表结构
主表某字段foreignKey指向副表时
```js
......
一个服务空间对应一整套独立的云开发资源,包括数据库、存储空间、云函数等资源。服务空间之间彼此隔离。
每个服务空间都有一个全局唯一的space ID。未来会支持一个应用同时连接多个服务空间,届时需要在代码中声明space ID以告诉代码要连接哪个云服务空间。
每个服务空间都有一个全局唯一的space ID。
开发者可在 HBuilderX 中新建服务空间,如下:
......
......@@ -103,6 +103,8 @@ js中敲下代码块`cdb`,即可快速输入上述代码。
**DBOptions参数说明**
> DBOptions仅腾讯云在云函数内可用
|字段 |类型 |必填 |描述 |平台差异说明 |
|:-: |:-: |:-: |:-: |:-: |
|spaceId|String |否 |同一账号下的,服务空间ID |仅腾讯云支持 |
......@@ -293,7 +295,7 @@ uniCloud数据库提供了多种数据导入导出和备份方案。
"MgoIsSparse": false // 是否为稀疏索引,请参考 https://uniapp.dcloud.net.cn/uniCloud/db-index.md?id=sparse
}
}],
"schema": {
"schema": { // HBuilderX 3.0.0以上版本schema不在此处,而是放在database目录下单独的`表名.schema.json`文件内
"bsonType": "object",
"permission": {
".read": true,
......@@ -353,8 +355,6 @@ uniCloud数据库提供了多种数据导入导出和备份方案。
### 数据库回档备份和恢复@backup
**此功能暂时只有腾讯云支持**
uniCloud腾讯云版会在每天自动备份一次数据库,最多保留7天。这让开发者不再担心数据丢失。
**操作说明**
......
## JQL查询调试器简介
## JQL数据库管理简介
为方便开发者调试查询语句,`HBuilderX 3.1.5`起内置了JQL查询调试器。用法如下
......
......@@ -22,7 +22,7 @@ uniCloud提供包月、按量计费两种计费方式(仅腾讯云),具体
|资源类目 |限制 |说明 |
|:-: |:-: |:-: |
|云函数并发限制 |1000个实例/服务空间 |实际普通项目很难达到这个并发数,阿里云可以设置单实例多并发单实例最多100,理论最大并发量1000*100=100000 (10万) |
|云函数并发限制 |1000个实例/服务空间 |实际普通项目很难达到这个并发数,阿里云可以设置单实例多并发单实例最多100,理论最大并发量1000*100=100000 (10万) ,关于单实例多并发请参考:[单实例多并发](uniCloud/cf-functions.md?id=concurrency) |
|每个服务空间的云函数数量 |48个 |实际项目中由于clientDB和单路由云函数,只会用到几个云函数,达不到限制数字。[详见](https://uniapp.dcloud.net.cn/uniCloud/faq?id=merge-functions) |
尤其注意阿里云的cdn确实是全免费的,这些免费资源可用于正常公司业务,阿里云不允许开发者使用这些免费的存储及CDN资源来开展图床类业务。
......
......@@ -11,11 +11,11 @@
- 对于老的uni-app项目,也可以对项目点右键,菜单中选择“创建uniCloud云开发环境”
- 新建uni-app项目的模板中,有一个`Hello uniCloud`项目模板,演示了各种云函数的使用。
uniCloud云开发环境创建成功后,项目根目录下会有一个带有云图标的特殊目录,名为“cloudfunctions”。(即便是cli创建的项目,云函数目录也在项目的根目录下,而不是src下)
uniCloud云开发环境创建成功后,项目根目录下会有一个带有云图标的特殊目录,名为“uniCloud”。(即便是cli创建的项目,云函数目录也在项目的根目录下,而不是src下)
非uni-app项目也可以通过使用[云函数Url化](uniCloud/http.md)来享受云函数的带来的便利。
## 目录结构
## 目录结构@structure
HBuilderX 3.0起目录结构做了调整如下:
......@@ -94,7 +94,7 @@ HBuilderX 3.0之前版本目录结构如下:
- 如果未进行实名认证,会跳转至实名认证页面进行实名认证,等待实名认证审核之后可以开通服务空间。若腾讯云实名认证提示身份证下已创建过多账户,则需要在腾讯云官网注销不用的账户。
- 创建服务空间可能需要几十秒的时间,可以在web控制台查看是否创建完成。
- 一个应用,可以在[dev.dcloud.net.cn](https://dev.dcloud.net.cn)设置协作者(选择应用->设置项目成员),实现多人共同使用一个云服务空间。(需 HBuilderX 2.5.9+)。协作者可以在HBuilderX和web控制台中操作被授权的服务空间,除了删除服务空间,其他功能均可正常操作。
- 一个应用,可以在[dev.dcloud.net.cn](https://dev.dcloud.net.cn)设置协作者(选择应用->设置项目成员),实现多人共同使用一个云服务空间。(需 HBuilderX 2.5.9+)。协作者可以在HBuilderX和web控制台中操作被授权的服务空间,除了删除服务空间,其他功能均可正常操作。授权其他用户访问的详细步骤请参考:[授权其他用户访问服务空间](https://uniapp.dcloud.net.cn/uniCloud/faq?id=collaborator)
- 多个项目可以复用一个服务空间,比如一个应用的用户端和管理端,在HBuilderX里可以创建成2个项目,但2个项目的服务空间可以指向一个,或者干脆把其中一个项目的服务空间绑定到另一个项目上,[详见](https://ask.dcloud.net.cn/article/37949)
## 创建云函数
......@@ -187,7 +187,7 @@ exports.main = async (event, context) => {
**注意**
- HBuilderX 3.0.0版本云函数目录有调整,请参考:[目录结构说明](https://uniapp.dcloud.io/uniCloud/quickstart?id=%e7%9b%ae%e5%bd%95%e7%bb%93%e6%9e%84)
- HBuilderX 3.0.0版本云函数目录有调整,请参考:[目录结构说明](uniCloud/quickstart.md?id=structure)
### 上传并运行云函数@uploadandrun
......@@ -362,7 +362,6 @@ const hour = getOffsetDate(8).getHours()
{
"otherParam": "***",
"clientInfo":{
CLIENT_SDK_VERSION: "1.0.0"
OS: "ios" // 系统类型 ios、android
PLATFORM: "h5" // 客户端类型 app-plus、h5、mp-weixin、mp-alipay等
}
......@@ -460,9 +459,9 @@ H5前端js访问云函数,涉及跨域问题,导致前端js无法连接云
- 运行到H5端时,使用HBuilderX内置浏览器,可以忽略跨域问题(mac版需2.5.10+)。
- 发行到H5端时,需要在uniCloud后台操作,绑定安全域名(在部署云函数的服务空间配置部署h5的域名作为安全域名),否则会因为跨域问题而无法访问。(在`cloudfunctions`目录右键可打开uniCloud后台)
> 注意跨域配置需要带上端口信息。例如:前端页面运行于:www.xxx.com:5001,跨域配置内配置:www.xxx.com不会对此页面生效,需要配置为:
> 注意跨域配置需要带上端口信息。例如:前端页面运行于:www.xxx.com:5001,跨域配置内配置:www.xxx.com不会对此页面生效,需要配置为:www.xxx.com:5001
**uniCloud后台配置安全域名:**
**uniCloud后台跨域配置:**
![](https://img.cdn.aliyun.dcloud.net.cn/uni-app/uniCloud/uniCloud-add-domain.png)
......
......@@ -192,7 +192,7 @@ uniCloud推出了`openDB`开源数据库规范,包括用户表、文章表、
注意:
- timestamp是一串数字的时间戳,一般通过如下js获取`var timestamp = new Date().getTime();`。它的好处是屏蔽了时区差异。阿里云和腾讯云的云端时区是0,但在HBuilderX本地运行云函数时,如果是中国的电脑,时区则会变成8,导致显示错乱。所以推荐使用时间戳。但时间戳是一串记录毫秒的数字,不合适直接渲染到前端界面上。推荐的做法是在前端渲染时使用[`<uni-dateformat>`组件](https://ext.dcloud.net.cn/plugin?id=3279)
- 时间戳和地理位置在web控制台的数据库管理界面上无法直接在引号里录入值,需参考[文档](uniCloud/quickstart?id=editdb)
- 日期和地理位置在web控制台的数据库管理界面上无法直接在引号里录入值,需参考[文档](uniCloud/quickstart?id=editdb)
- double类型慎重,由于js不能精准处理浮点运算,0.1+0.2=0.30000000000000004。所以涉及金额时,建议使用int而不是double,以分为单位而不是以元为单位存储。比如微信支付默认就是以分为单位。如果使用[uniPay](uniCloud/unipay)处理支付的话,它的默认单位也是分。
......@@ -1013,7 +1013,7 @@ permission的字段级控制,包括读写两种权限,分别称为:read、
**注意**
- `auth.xxx`均由uni-id提供,依赖于[uni-id公共模块](uniCloud/uni-id.md)
- `doc.xxx`表示将要查询/修改/删除的每条数据,如果将要访问的数据不满足permission规则将会拒绝执行
- `doc.xxx`表示将要查询/修改/删除的每条数据(注意并不包括新增数据,新增数据应通过值域校验进行验证),如果将要访问的数据不满足permission规则将会拒绝执行
- `uni-id`的角色和权限,也即auth.role和auth.permission是不一样的概念。注意阅读[uni-id 角色权限](/uniCloud/uni-id?id=rbac)
- 如果想支持使用多个`action`的用法,可以通过`"'actionRequired' in action"`的形式配置权限,限制客户端使用的action内必须包含名为`actionRequired`的action
- doc是由客户端条件里面提取的变量,可以理解为将要访问的数据,因此create权限内不可使用doc变量,建议使用forceDefaultValue或自定义校验函数实现插入数据的校验。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册