diff --git a/docs/uniCloud/_sidebar.md b/docs/uniCloud/_sidebar.md index f28300e1e07920947c078c2ba71a98c30563b58c..b6389cba379802f2f744cb2e063cf0aa767cd07c 100644 --- a/docs/uniCloud/_sidebar.md +++ b/docs/uniCloud/_sidebar.md @@ -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) * 云函数 diff --git a/docs/uniCloud/cf-functions.md b/docs/uniCloud/cf-functions.md index 0538f576a2f9969647033fbb3081eb2560b3b127..f889508d7c73124a9406b28230f9ec88267585ca 100644 --- a/docs/uniCloud/cf-functions.md +++ b/docs/uniCloud/cf-functions.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 diff --git a/docs/uniCloud/clientdb.md b/docs/uniCloud/clientdb.md index 18b5477478bc8bb75e3cd916a16b79714171b2d8..dfd69aac29b860f11b13b983ae0b9caa5955cb18 100644 --- a/docs/uniCloud/clientdb.md +++ b/docs/uniCloud/clientdb.md @@ -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,``组件也支持所有`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 diff --git a/docs/uniCloud/concepts/space.md b/docs/uniCloud/concepts/space.md index e1cdef2e6dd9eab21a0ec79998e1a0537b1f6130..218af435953d68b5713d68a46c74a7351caf7ccd 100644 --- a/docs/uniCloud/concepts/space.md +++ b/docs/uniCloud/concepts/space.md @@ -1,6 +1,6 @@ 一个服务空间对应一整套独立的云开发资源,包括数据库、存储空间、云函数等资源。服务空间之间彼此隔离。 -每个服务空间都有一个全局唯一的space ID。未来会支持一个应用同时连接多个服务空间,届时需要在代码中声明space ID以告诉代码要连接哪个云服务空间。 +每个服务空间都有一个全局唯一的space ID。 开发者可在 HBuilderX 中新建服务空间,如下: diff --git a/docs/uniCloud/hellodb.md b/docs/uniCloud/hellodb.md index f5e2afd13450e5387a0b35aa7f28a4231902a8df..662897bbfe7e52585f5e984d00c33db9f57fa880 100644 --- a/docs/uniCloud/hellodb.md +++ b/docs/uniCloud/hellodb.md @@ -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天。这让开发者不再担心数据丢失。 **操作说明** diff --git a/docs/uniCloud/jql-runner.md b/docs/uniCloud/jql-runner.md index 13d3e957457141e14a17616af22c642786b28554..c4deb6095cb4f67512a862f8d04a4490a48db99f 100644 --- a/docs/uniCloud/jql-runner.md +++ b/docs/uniCloud/jql-runner.md @@ -1,4 +1,4 @@ -## JQL查询调试器简介 +## JQL数据库管理简介 为方便开发者调试查询语句,`HBuilderX 3.1.5`起内置了JQL查询调试器。用法如下 diff --git a/docs/uniCloud/price.md b/docs/uniCloud/price.md index 403e83c1fbbc52c2c47b169fc31bf46fb68d5962..226613c609e3cab80d8e1591fc8f2ca5b401a32a 100644 --- a/docs/uniCloud/price.md +++ b/docs/uniCloud/price.md @@ -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资源来开展图床类业务。 diff --git a/docs/uniCloud/quickstart.md b/docs/uniCloud/quickstart.md index 48271cae3460b1404ae57ac4070798001014bd1b..94b1267fa1190556270f25d0075fdc1c2da47b7b 100644 --- a/docs/uniCloud/quickstart.md +++ b/docs/uniCloud/quickstart.md @@ -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) diff --git a/docs/uniCloud/schema.md b/docs/uniCloud/schema.md index 62c2445422e9f2d8d85933315c52574b61c31a17..2f7d473609485638997b87e9a47172876b8d0f17 100644 --- a/docs/uniCloud/schema.md +++ b/docs/uniCloud/schema.md @@ -192,7 +192,7 @@ uniCloud推出了`openDB`开源数据库规范,包括用户表、文章表、 注意: - timestamp是一串数字的时间戳,一般通过如下js获取`var timestamp = new Date().getTime();`。它的好处是屏蔽了时区差异。阿里云和腾讯云的云端时区是0,但在HBuilderX本地运行云函数时,如果是中国的电脑,时区则会变成8,导致显示错乱。所以推荐使用时间戳。但时间戳是一串记录毫秒的数字,不合适直接渲染到前端界面上。推荐的做法是在前端渲染时使用[``组件](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或自定义校验函数实现插入数据的校验。