提交 301cfed1 编写于 作者: D DCloud_LXH

feat: 修复 (uniCloud/*) 形式链接

上级 9ed9867f
云函数中支持对云数据库的全部功能的操作。本章节主要讲解如何在云函数内通过传统api操作数据库,如需在云函数内使用JQL语法操作数据库,请参考:[云函数内使用JQL语法](uniCloud/jql-cloud.md)
云函数中支持对云数据库的全部功能的操作。本章节主要讲解如何在云函数内通过传统api操作数据库,如需在云函数内使用JQL语法操作数据库,请参考:[云函数内使用JQL语法](jql-cloud.md)
## 获取集合的引用@get-collection
......@@ -191,7 +191,7 @@ let res = await db.collection('goods').where({
memory: 8,
}
}).get()
// 正确示例
let res = await db.collection('goods').where([{
category: 'computer',
......@@ -352,7 +352,7 @@ collection.skip(value)
let res = await collection.skip(4).get()
```
**注意:数据量很大的情况下,skip性能会很差,尽量使用其他方式替代,参考:[skip性能优化](uniCloud/db-performance.md?id=skip)**
**注意:数据量很大的情况下,skip性能会很差,尽量使用其他方式替代,参考:[skip性能优化](db-performance.md?id=skip)**
### 对结果排序@order-by
......@@ -851,7 +851,7 @@ db.collection('articles').where({
version: new db.RegExp({
regex: '^\\ds', // 正则表达式为 /^\ds/,转义后变成 '^\\ds'
options: 'i' // i表示忽略大小写
})
})
})
```
......@@ -1030,7 +1030,7 @@ db.collection("table1").doc("5f79fdb337d16d0001899566").remove()
console.log( err.message )
})
.finally(() => {
})
```
......@@ -1950,7 +1950,7 @@ exports.main = async (event) => {
const updateBBBRes = await transaction.collection('account').doc('bbb').update({
amount: dbCmd.inc(10)
})
const aaaEndRes = await transaction.collection('account').doc('aaa').get()
if (aaaEndRes.data.amount < 0) { // 请注意transaction.doc().get()返回的data不是数组形式
await transaction.rollback(-100)
......
......@@ -277,21 +277,21 @@ return {
|API |描述 |
|-- |-- |
|uniCloud.database() |云数据库对象 [详情](uniCloud/cf-database.md) |
|uniCloud.databaseJQL() |云函数中使用JQL语法操作数据库 [详见](uniCloud/jql-cloud.md),需添加扩展库 |
|uniCloud.redis() |使用redis [详见](uniCloud/redis.md),需添加扩展库
|uniCloud.uploadFile() |云函数上传文件到云存储 [详情](uniCloud/storage?id=clouduploadfile) |
|uniCloud.downloadFile() |云函数下载云存储的文件到云函数运行环境 [详情](uniCloud/storage?id=clouddownloadfile) |
|uniCloud.deleteFile() |云函数删除云存储的文件 [详情](uniCloud/storage?id=clouddeletefile) |
|uniCloud.getTempFileURL() |获取云存储文件的临时路径 [详情](uniCloud/storage?id=cloudgettempfileurl) |
|uniCloud.customAuth() |使用云厂商自定义登录,仅腾讯云支持[详情](uniCloud/authentication.md?id=cloud-custom-auth) |
|uniCloud.database() |云数据库对象 [详情](cf-database.md) |
|uniCloud.databaseJQL() |云函数中使用JQL语法操作数据库 [详见](jql-cloud.md),需添加扩展库 |
|uniCloud.redis() |使用redis [详见](redis.md),需添加扩展库
|uniCloud.uploadFile() |云函数上传文件到云存储 [详情](storage?id=clouduploadfile) |
|uniCloud.downloadFile() |云函数下载云存储的文件到云函数运行环境 [详情](storage?id=clouddownloadfile) |
|uniCloud.deleteFile() |云函数删除云存储的文件 [详情](storage?id=clouddeletefile) |
|uniCloud.getTempFileURL() |获取云存储文件的临时路径 [详情](storage?id=cloudgettempfileurl) |
|uniCloud.customAuth() |使用云厂商自定义登录,仅腾讯云支持[详情](authentication.md?id=cloud-custom-auth) |
|uniCloud.callFunction() |云函数/云对象中调用另一个云函数 [见下](#callbyfunction) |
|uniCloud.importObject() |云函数/云对象中调用另一个云对象 [详情](cloud-obj.md?id=call-by-cloud) |
|uniCloud.httpclient |云函数中通过http访问其他系统 [见下](#httpclient) |
|uniCloud.httpProxyForEip |使用云厂商代理访问http服务(阿里云的解决微信需要固定IP的方案),仅阿里云云端环境支持 [详见](#aliyun-eip),新增于`HBuilderX 3.5.5`|
|uniCloud.sendSms() |发送短信,需添加扩展库 [详见](uniCloud/send-sms.md) |
|uniCloud.getPhoneNumber() |获取一键登录手机号,需添加扩展库 [详见](uniCloud/univerify.md?id=cloud) |
|uniCloud.init() |获取指定服务空间的uniCloud实例 [详见](uniCloud/concepts/space.md?id=multi-space) |
|uniCloud.sendSms() |发送短信,需添加扩展库 [详见](send-sms.md) |
|uniCloud.getPhoneNumber() |获取一键登录手机号,需添加扩展库 [详见](univerify.md?id=cloud) |
|uniCloud.init() |获取指定服务空间的uniCloud实例 [详见](concepts/space.md?id=multi-space) |
|uniCloud.logger |云函数中打印日志到[uniCloud web控制台](https://unicloud.dcloud.net.cn/)的日志系统(非HBuilderX控制台)[详情](rundebug.md?id=uniCloudlogger) |
|uniCloud.getRequestList |获取当前云函数实例内正在处理的请求Id列表 [详见](#get-request-list),新增于`HBuilderX 3.5.5`|
|uniCloud.getClientInfos |获取当前云函数实例内正在处理的请求对应的客户端信息列表 [详见](#get-client-infos),新增于`HBuilderX 3.5.5`|
......@@ -314,8 +314,8 @@ return {
云函数中支持访问本服务空间下的、或经授权的其他服务空间下的,数据库。
- 使用 JQL 语法操作数据库,另见[文档](uniCloud/jql-cloud.md)
- 使用 MongoDB 语法操作数据库,另见[文档](uniCloud/cf-database.md)
- 使用 JQL 语法操作数据库,另见[文档](jql-cloud.md)
- 使用 MongoDB 语法操作数据库,另见[文档](cf-database.md)
## 访问其他HTTP服务@httpclient
......@@ -699,7 +699,7 @@ getClientInfos返回的信息,是在客户端的[uni.getSystemInfo](https://un
- 客户端上报的信息在理论上存在被篡改可能,实际业务中应验证前端传来的数据的合法性
- 除了clientIP外,其他客户端信息只有使用uni-app客户端以callFunction或者importObject方式访问云函数或云对象时才有
- 云对象与云函数内获取客户端platform稍有不同,云函数未拉齐vue2、vue3版本app平台的platform值,vue2为`app-plus`,vue3为`app`。云对象无论客户端是vue2还是vue3,在app平台获取的platform均为`app`。这一点在使用uni-id时需要特别注意,详情见:[uni-id文档 preferedAppPlatform](uniCloud/uni-id.md?id=prefered-app-platform)
- 云对象与云函数内获取客户端platform稍有不同,云函数未拉齐vue2、vue3版本app平台的platform值,vue2为`app-plus`,vue3为`app`。云对象无论客户端是vue2还是vue3,在app平台获取的platform均为`app`。这一点在使用uni-id时需要特别注意,详情见:[uni-id文档 preferedAppPlatform](uni-id.md?id=prefered-app-platform)
除了`uniCloud.getClientInfos()`API,在云函数context和云对象this中,也可以直接获取当前客户端信息。
- 云对象通过`this.getClientInfo()`[详情](cloud-obj.md#get-client-info)
......@@ -758,11 +758,11 @@ uniCloud的api中,有些api对应的实现,其代码体积较大,且这些
**目前支持的扩展库如下**
- JQL扩展库[uni-cloud-jql]:用于在云函数内使用JQL语法操作数据库,详见:[JQL扩展库](uniCloud/jql-cloud.md)
- redis扩展库[uni-cloud-redis]:云函数内使用redis,详见:[redis扩展库](uniCloud/redis.md)
- 发送短信扩展[uni-cloud-sms]:云函数中发送短信,详见:[sms扩展](uniCloud/send-sms?id=extension)
- 一键登录与实人认证扩展[uni-cloud-verify]:手机App调用运营商一键登录服务时,云函数中获取到真实手机号, 详见:[一键登录扩展库](uniCloud/univerify?id=extension)。核验终端操作者的真实身份,详见:[uni实人认证](frv/intro.md)
- 统一推送服务扩展库[uni-cloud-push]:云函数内使用uni-push,详见:[统一推送服务扩展库](uniCloud/uni-cloud-push/api.md)
- JQL扩展库[uni-cloud-jql]:用于在云函数内使用JQL语法操作数据库,详见:[JQL扩展库](jql-cloud.md)
- redis扩展库[uni-cloud-redis]:云函数内使用redis,详见:[redis扩展库](redis.md)
- 发送短信扩展[uni-cloud-sms]:云函数中发送短信,详见:[sms扩展](send-sms?id=extension)
- 一键登录与实人认证扩展[uni-cloud-verify]:手机App调用运营商一键登录服务时,云函数中获取到真实手机号, 详见:[一键登录扩展库](univerify?id=extension)。核验终端操作者的真实身份,详见:[uni实人认证](frv/intro.md)
- 统一推送服务扩展库[uni-cloud-push]:云函数内使用uni-push,详见:[统一推送服务扩展库](uni-cloud-push/api.md)
以下是一个开启了redis扩展库的云函数package.json示例,注意此文件不支持注释,下方示例中的注释仅为演示
......@@ -780,7 +780,7 @@ uniCloud的api中,有些api对应的实现,其代码体积较大,且这些
## 公共模块@common
云函数支持公共模块。多个云函数/云对象的共享部分,可以抽离为公共模块,然后被多个云函数引用。由于篇幅较长,[详见](uniCloud/cf-common)
云函数支持公共模块。多个云函数/云对象的共享部分,可以抽离为公共模块,然后被多个云函数引用。由于篇幅较长,[详见](cf-common)
## 使用npm
......@@ -927,7 +927,7 @@ exports.main = async (event, context) => {
> 仅支付宝小程序云与腾讯云支持
在支付宝小程序云与腾讯云服务空间的云函数内支持获取**同账号**下其他服务空间的uniCloud实例,参考:[一个应用访问多个服务空间](uniCloud/concepts/space.md?id=multi-space),并使用此实例调用对应服务空间的云函数。
在支付宝小程序云与腾讯云服务空间的云函数内支持获取**同账号**下其他服务空间的uniCloud实例,参考:[一个应用访问多个服务空间](concepts/space.md?id=multi-space),并使用此实例调用对应服务空间的云函数。
```javascript
//开发者创建了多个服务空间,则需手动初始化。注意这是前端代码,不是云函数代码
......@@ -1248,7 +1248,7 @@ exports.main = async function() {
- 运行环境在云端云函数创建时设定,不可通过更新云函数来修改。
也就是第一次上传云函数的时候,package.json里配了什么,就是什么。如果需要修改node环境,需先删除云端云函数,重新上传。
node版本可以在云函数的package.json文件的`cloudfunction-config->runtime`字段进行配置,详情参考:[云函数package.json](uniCloud/cf-functions.md?id=packagejson)
node版本可以在云函数的package.json文件的`cloudfunction-config->runtime`字段进行配置,详情参考:[云函数package.json](cf-functions.md?id=packagejson)
### 时区
......@@ -1281,7 +1281,7 @@ node版本可以在云函数的package.json文件的`cloudfunction-config->runti
腾讯云定时任务触发最大支持900秒超时时间。非定时触发时超时时间为30秒,客户端请求云函数时如果超出30秒云函数断开链接后会继续运行,最大能运行到配置的超时时间。
如果超时时间仍然不够用,可以参考云函数递归调用,连续执行多个云函数处理一个任务[详情查看](uniCloud/cf-functions.md?id=recurrence)
如果超时时间仍然不够用,可以参考云函数递归调用,连续执行多个云函数处理一个任务[详情查看](cf-functions.md?id=recurrence)
### 固定出口IP@eip
......@@ -1487,7 +1487,7 @@ package.json是一个标准json文件,不可带注释。下面是一个package
支付宝小程序云与阿里云定时触发的cron表达式不支持代表年的第七位,但是在package.json内配置时仍需将第七位设置为*
**在web控制台配置trigger请参考:[定时触发](uniCloud/trigger.md)**
**在web控制台配置trigger请参考:[定时触发](trigger.md)**
package.json内统一了支付宝小程序云、腾讯云、阿里云三家厂商的配置,三个平台都需要配置为如下形式
......
......@@ -21,9 +21,9 @@ JQL语法相关文档已移至:[JQL语法](jql.md)
**注意**
- `clientDB`依赖uni-id(`1.1.10+版本`)提供用户身份和权限校验,存在uni-id-common时clientDB会优先依赖uni-id-common,如果你不了解uni-id,请参考:[uni-id文档](uniCloud/uni-id.md)[uni-id-common文档](uniCloud/uni-id-common.md)
- `clientDB`依赖的uni-id需要在uni-id的config.json内添加uni-id相关配置,通过uni-id的init方法传递的参数不会对clientDB生效,参考:[uni-id 配置](uniCloud/uni-id.md?id=config)[uni-id新版配置(uni-id-co + uni-id-common)](uniCloud/uni-id/summary.md?id=config)
- 通常在管理控制台使用`clientDB`,需要获取不同角色用户拥有的权限(在权限规则内使用auth.permission),请先查阅:[uni-id 角色权限](uniCloud/uni-id.md?id=rbac)[uni-id新版角色权限(uni-id-co + uni-id-common)](uniCloud/uni-id/summary.md?id=rbac)
- `clientDB`依赖uni-id(`1.1.10+版本`)提供用户身份和权限校验,存在uni-id-common时clientDB会优先依赖uni-id-common,如果你不了解uni-id,请参考:[uni-id文档](uni-id.md)[uni-id-common文档](uni-id-common.md)
- `clientDB`依赖的uni-id需要在uni-id的config.json内添加uni-id相关配置,通过uni-id的init方法传递的参数不会对clientDB生效,参考:[uni-id 配置](uni-id.md?id=config)[uni-id新版配置(uni-id-co + uni-id-common)](uni-id/summary.md?id=config)
- 通常在管理控制台使用`clientDB`,需要获取不同角色用户拥有的权限(在权限规则内使用auth.permission),请先查阅:[uni-id 角色权限](uni-id.md?id=rbac)[uni-id新版角色权限(uni-id-co + uni-id-common)](uni-id/summary.md?id=rbac)
......@@ -74,7 +74,7 @@ js API可以执行所有数据库操作。`<unicloud-db>`组件是js API的再
- 在HBuilderX 3.0+,`<unicloud-db>`组件已经内置,可以直接使用。文档另见:[`<unicloud-db>`组件](/uniCloud/unicloud-db)
以下文章重点介绍`clientDB`的js API。至于组件的用法,另见[文档](uniCloud/unicloud-db.md)
以下文章重点介绍`clientDB`的js API。至于组件的用法,另见[文档](unicloud-db.md)
## clientDB前端API@jssdk
......@@ -150,7 +150,7 @@ database接口和databaseForJQL有以下不同点
}]
}
```
2. 使用拦截器相关接口拦截或取消拦截 databaseForJQL 接口时需使用,`databaseForJQL`作为接口名,关于拦截器的更多信息,请参考:[uniCloud 拦截器](client-sdk.md#add-interceptor)
......@@ -203,4 +203,4 @@ db.off('error', onDBError)
## JQL语法@jql
clientDB使用JQL在客户端编写查询语句,关于JQL语法请参考:[JQL语法](uniCloud/jql.md)
clientDB使用JQL在客户端编写查询语句,关于JQL语法请参考:[JQL语法](jql.md)
......@@ -146,7 +146,7 @@ _注:以上例子仅用于方便初学者理解。实际开发中对于简单
2. 更精简的代码
3. 更少的协作成本(以及矛盾~)
4. 客户端调用时在ide里有完善的代码提示,方法参数均可提示。(传输json可没法在ide里提示)
5. 默认支持[uniCloud响应体规范](uniCloud/cf-functions.md?id=resformat),方便错误拦截和统一处理
5. 默认支持[uniCloud响应体规范](cf-functions.md?id=resformat),方便错误拦截和统一处理
## 快速上手
......@@ -263,7 +263,7 @@ interface ImportObjectOptions {
云对象作为云函数的一种,可以调用所有node的API和uniCloud的API。
uniCloud有众多API,另见:[uniCloud的API清单](uniCloud/cf-functions.html#unicloud-api%E5%88%97%E8%A1%A8)
uniCloud有众多API,另见:[uniCloud的API清单](cf-functions.html#unicloud-api%E5%88%97%E8%A1%A8)
除上述API之外,云对象的this对象还有一批专用方法来获取当前请求的上下文信息。
......@@ -322,7 +322,7 @@ getClientInfo().source,返回云函数调用来源,它的值域为:
**注意事项**
- 客户端上报的信息在理论上存在被篡改可能,实际业务中应验证前端传来的数据的合法性
- 除了clientIP外,其他客户端信息只有使用uni-app客户端以云对象的方式调用才能获取
- 云对象与云函数内获取客户端platform稍有不同,云函数未拉齐vue2、vue3版本app平台的platform值,vue2为`app-plus`,vue3为`app`。云对象无论客户端是vue2还是vue3,在app平台获取的platform均为`app`。这一点在使用uni-id时需要特别注意,详情见:[uni-id文档 preferedAppPlatform](uniCloud/uni-id.md?id=prefered-app-platform)
- 云对象与云函数内获取客户端platform稍有不同,云函数未拉齐vue2、vue3版本app平台的platform值,vue2为`app-plus`,vue3为`app`。云对象无论客户端是vue2还是vue3,在app平台获取的platform均为`app`。这一点在使用uni-id时需要特别注意,详情见:[uni-id文档 preferedAppPlatform](uni-id.md?id=prefered-app-platform)
### 获取云端信息@get-cloud-info
......@@ -381,7 +381,7 @@ module.exports = {
### 获取当前调用的方法名@get-method-name
本方法主要用于在`_before`等拦截器方法里,判断客户端上传的信息进行处理,比如发现客户端调用的是a方法时,执行一段特殊逻辑。详见下文的[预处理](uniCloud/cloud-obj?id=before-and-after)
本方法主要用于在`_before`等拦截器方法里,判断客户端上传的信息进行处理,比如发现客户端调用的是a方法时,执行一段特殊逻辑。详见下文的[预处理](cloud-obj?id=before-and-after)
**接口形式**
......@@ -399,7 +399,7 @@ module.exports = {
### 获取当前参数列表@get-params
在云对象的普通方法里,参数可以直接获取。本方法主要用于在_`_before`等拦截器方法里,判断客户端上传的信息进行处理。详见下文的[预处理](uniCloud/cloud-obj?id=before-and-after)
在云对象的普通方法里,参数可以直接获取。本方法主要用于在_`_before`等拦截器方法里,判断客户端上传的信息进行处理。详见下文的[预处理](cloud-obj?id=before-and-after)
**接口形式**
......@@ -591,11 +591,11 @@ module.exports = {
理论上,开发者可以使用任意方式返回正确状态下的数据格式,返回字符串、json对象都可以。
但在错误处理时,推荐使用[uniCloud响应体规范](uniCloud/cf-functions.md?id=resformat),以方便客户端统一拦截错误。
但在错误处理时,推荐使用[uniCloud响应体规范](cf-functions.md?id=resformat),以方便客户端统一拦截错误。
在云对象内部报错时,比如方法名错误等非开发者代码返回的错误,会自动使用[uniCloud响应体规范](uniCloud/cf-functions.md?id=resformat)抛出错误对象。
在云对象内部报错时,比如方法名错误等非开发者代码返回的错误,会自动使用[uniCloud响应体规范](cf-functions.md?id=resformat)抛出错误对象。
开发者代码在主动报错时,比如参数校验错误,由于不能直接写入错误对象(e),则需要按照[uniCloud响应体规范](uniCloud/cf-functions.md?id=resformat)在返回的json对象中加入`errCode``errMsg`
开发者代码在主动报错时,比如参数校验错误,由于不能直接写入错误对象(e),则需要按照[uniCloud响应体规范](cf-functions.md?id=resformat)在返回的json对象中加入`errCode``errMsg`
uni-app框架在拿到云对象的响应结果后,会识别其中是否包含`errCode``errMsg`,然后自动创建报错对象(e),策略如下:
......@@ -700,7 +700,7 @@ const res = await todo.add('title demo', 'content demo')
### 跨服务空间调用云对象@call-by-cloud-cross-space
云端或者客户端均有uniCloud.init方法可以获取其他服务空间的uniCloud实例,使用此实例的importObject可以调用其他服务空间的云对象,[参考](uniCloud/concepts/space.md?id=multi-space)
云端或者客户端均有uniCloud.init方法可以获取其他服务空间的uniCloud实例,使用此实例的importObject可以调用其他服务空间的云对象,[参考](concepts/space.md?id=multi-space)
客户端无论腾讯阿里均支持。云端`uniCloud.init`方法仅腾讯云支持,且仅能获取同账号下的腾讯云服务空间的uniCloud实例。
......
......@@ -25,4 +25,4 @@ HBuilderX 3.0之前版本,项目下没有`uniCloud`目录,直接在`cloudfun
云函数修改后,可以本地运行。只有上传到云端,方可在云端生效。
更多云函数介绍参考[规范](uniCloud/cf-functions)
更多云函数介绍参考[规范](../cf-functions)
`uniCloud` 提供了 2 个 nosql 数据库。
- JSON文档型云数据库
uniCloud阿里云版的云数据库就是 MongoDB 的 serverless版;uniCloud腾讯云版的云数据库是兼容 MongoDB 的自研数据库。
数据库中的每条记录都是一个 JSON 格式的对象。
一个数据库可以有多个集合(相当于关系型数据中的表),集合可看做一个 JSON 数组,数组中的每个对象就是一条记录,记录的格式是 JSON 对象。
这对于js工程师而言,非常容易理解掌握。
MongoDB的传统操作方法还是比较复杂,uniCloud提供了更多简单操作数据库的方案,包括类似 SQL 的 JQL 语法、clientDB等技术。
在uniCloud中,云数据库、MongoDB数据库,这些概念一般都是指这个数据库,更多云数据库介绍[参考](uniCloud/hellodb.md)
在uniCloud中,云数据库、MongoDB数据库,这些概念一般都是指这个数据库,更多云数据库介绍[参考](../hellodb.md)。
- redis 数据库
redis 是一种可以运行在内存中的键值对数据库,它的能力没有MongoDB强大,但由于可运行在内存中,它的性能远超常规数据库。
redis 也使用 json 方式 key/value 键值对存储数据。更多文档[参考](redis.md)
redis 也使用 json 方式 key/value 键值对存储数据。更多文档[参考](../redis.md)
如果开发者需要其他数据库,比如 mysql、ElasticSearch、数据湖,这些数据库没有在uniCloud的服务空间内置,云函数中通过 nodejs 的 api 可以访问这些远程数据库。
......
......@@ -18,10 +18,10 @@
1. 进入 [uniCloud 控制台](https://console.cloud.tencent.com/tcb)
2. 切换到【云数据库】标签页,并选择需要添加索引的集合,进入索引管理 tab 页,如下图。
![web控制台添加索引](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/unicloud-web-index.jpg)
![web控制台添加索引](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/unicloud-web-index.jpg)
3. 添加索引。
![添加索引](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/composed-index.jpg)
注意:
......@@ -73,16 +73,16 @@
组合索引即一个索引包含多个字段。当查询条件使用的字段包含在索引定义的所有字段或前缀字段里时,会命中索引,优化查询性能。
> 索引前缀即组合索引的字段中定义的前 1 到多个字段,例如对集合 **students** 中 **name**, **age**, **score** 三个字段按顺序定义了组合索引,那么该索引的前缀包含
>
>
> - **name**
> - **name, age**
>
>
> 能命中索引的查询字段组合包含
>
>
> - **name**
> - **name, age**
> - **name, age, score**
>
>
```json
{
......@@ -139,7 +139,7 @@ ttl索引用于设置数据过期时间,并在数据过期后进行删除。**
假如**记录中不存在某个字段,则对索引字段来说其值默认为 null**。如果索引有唯一性限制,则不允许存在两个或以上的该字段为空 / 不存在该字段的记录。
针对上述问题,阿里云支持将索引设置为[稀疏索引](uniCloud/db-index.md?id=sparse),腾讯云暂不支持稀疏索引。
针对上述问题,阿里云支持将索引设置为[稀疏索引](db-index.md?id=sparse),腾讯云暂不支持稀疏索引。
### 稀疏索引@sparse
......
......@@ -15,7 +15,7 @@
- 更完善的工具链。前端uni-app、云端uniCloud、还有ide端的HBuilderX,互相紧密搭配,打造闭环的优秀开发体验
- 更丰富的生态。插件市场有大量现成的轮子和资源 [详见](https://ext.dcloud.net.cn/?cat1=7&orderBy=TotalDownload)
如果你已经使用过微信小程序云开发,想进一步了解对比差异或如何从微信小程序云迁移到uniCloud,[详见](uniCloud/wx2unicloud.md)
如果你已经使用过微信小程序云开发,想进一步了解对比差异或如何从微信小程序云迁移到uniCloud,[详见](wx2unicloud.md)
### uniCloud稳定吗?DCloud服务器异常会影响我的线上业务吗?
......@@ -218,7 +218,7 @@ uniCloud的每个云函数是一个独立进程,不存在云函数级别的多
1. 参考[阿里云全球加速](https://help.aliyun.com/document_detail/153198.html)文档,开通服务并对`自有域名`进行加速
2. 将上述域名CNAME到`api.next.bspapp.com`
3. [自行初始化uniCloud](uniCloud/init.md)传入endpoint参数,其值为开通全球加速的自有域名
3. [自行初始化uniCloud](init.md)传入endpoint参数,其值为开通全球加速的自有域名
### 腾讯云提示当前实名主体已经有三个账号怎么办@tencent-exceed-account-limit
......@@ -233,7 +233,7 @@ uniCloud的每个云函数是一个独立进程,不存在云函数级别的多
### 高并发下简单的防止超卖
> uniCloud阿里云现已支持redis,开通并使用redis请参考:[redis开通和使用](uniCloud/redis.md),如何使用redis防止超卖请参考:[redis高并发抢购](uniCloud/redis.md?id=snap-over-sell)(推荐使用)。如下方式针对无redis场景比较不灵活(不推荐使用)
> uniCloud阿里云现已支持redis,开通并使用redis请参考:[redis开通和使用](redis.md),如何使用redis防止超卖请参考:[redis高并发抢购](redis.md?id=snap-over-sell)(推荐使用)。如下方式针对无redis场景比较不灵活(不推荐使用)
高并发时很多用户同时对一条数据读写,很容易造成数据混乱,表现在秒杀抢购等场景就是超卖。以秒杀为例,开发者可以从扣除库存这步入手对超卖进行很大程度的限制,下面是一个简单的示例(**注意以下代码未使用事务**
......@@ -270,7 +270,7 @@ exports.main = async function(event){
### 部署网站到前端网页托管报“The requested file was not found on this server.”
- 部署history模式的uni-app项目时,如果未修改前端网页托管的配置,直接访问子页面时就会遇到上面的错误。如何配置请参考[部署uni-app项目](uniCloud/hosting.md?id=host-uni-app)
- 部署history模式的uni-app项目时,如果未修改前端网页托管的配置,直接访问子页面时就会遇到上面的错误。如何配置请参考[部署uni-app项目](hosting.md?id=host-uni-app)
### 使用腾讯云报未登录Cloudbase
......@@ -281,7 +281,7 @@ exports.main = async function(event){
1. 错误信息:`该域名已经被添加过,不能重复添加`
前端网页托管会和阿里云上其他的CDN业务(包括但不限于CDN)冲突,如需绑定到前端网页托管请先将此域名与其他业务解除关联。
2. 错误信息:`The root domain of your domain is reserved by another account`
当前域名有在阿里云开通全站加速相关业务(可能配置了泛域名加速),与前端网页托管冲突。可以考虑使用三级域名或去除泛域名加速改为单独配置需要加速的域名。
......
......@@ -136,7 +136,7 @@ record可以增删改查、排序统计。后续有API介绍。
如果我们要根据name字段来查询,为了提升查询速度,此时可以把name字段设为非唯一索引。
索引内容较多,还有“组合索引”、“稀疏索引”、“地理位置索引”、“TTL索引”等概念。有单独的文档详细讲述索引,另见:[数据库索引](uniCloud/db-index.md)
索引内容较多,还有“组合索引”、“稀疏索引”、“地理位置索引”、“TTL索引”等概念。有单独的文档详细讲述索引,另见:[数据库索引](db-index.md)
**在web控制台添加上述索引**
......@@ -157,7 +157,7 @@ record可以增删改查、排序统计。后续有API介绍。
但如果使用 JQL,那`DB Schema`就是必须的。
`DB Schema`涉及内容较多,另见文档:[https://uniapp.dcloud.io/uniCloud/schema](uniCloud/schema)
`DB Schema`涉及内容较多,另见文档:[https://uniapp.dcloud.io/uniCloud/schema](schema)
## API操作数据库的方式@db-operation-type
......@@ -178,25 +178,25 @@ uniCloud 默认推荐使用 JQL 语法操作数据库,它是一种更简单易
|传统MongoDB客户端 |√ |X |X |
关于几种操作数据库方式的选择:
1. 优先使用客户端操作数据库(称为[clientDB](uniCloud/clientdb.md)
1. 优先使用客户端操作数据库(称为[clientDB](clientdb.md)
传统开发中,其实大多数服务器接口开发,就是检验下前端数据和身份的合法性,然后写个SQL操作下数据库,返回JSON给前端。其实很无聊。
clientDB最大的好处就是不用写服务端代码,客户端直接操作数据库。因为uniCloud提供了[DB Schema](schema.md)和[uni-id](uni-id/summary.md),可以直接控制数据库的内容和权限校验。
clientDB同时支持`action云函数`作为补充,当发起一个客户端操作云数据库的请求时,可以同时触发一个`action云函数`,在云端对数据库操作进行前置或后置处理。
如下场景不适用clientDB:
- 相关数据库操作逻辑不适合暴露在前端,比如抽奖
- 注册、修改密码等操作password类型数据(password类型不会传给前端)的情况。一般情况下开发者不涉及相关问题。因为注册、修改密码等账户管理相关,官方已提供了[uni-id-pages](uni-id-pages.md),里面有uni-id-co云对象。所以开发者无需自己编写相关逻辑,直接用这个插件就好了。
- 三方服务器回调。在登录、支付等涉及隐私的地方较常见。比如从微信服务器获取用户手机号,只支持云端获取,获取后要入库保存
2. 其次使用云函数的JQL扩展库来操作数据库
对于clientDB不适应的场景,推荐在云函数或云对象中使用JQL。
目前云函数中JQL不适用的场景:使用 set 操作符动态修改字段名称(不是字段值)。这个场景常规业务不涉及,未来JQL可能会完善并支持这个场景。
3. 除非开发者原本就对 nodejs 操作 MongoDB 非常熟悉,且需要使用 set 操作符动态修改字段名等,否则不推荐使用传统MongoDB写法。
MongoDB API操作数据库,不能在客户端操作、不支持 DB Schema,不支持HBuilderX的jql查询器,不能在客户端的代码提示中提示数据库的表名、字段。
......@@ -226,7 +226,7 @@ js中敲下代码块`cdb`,即可快速输入上述代码。
exports.main = async (event, context) => {
const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用,此处需要传入云函数的event和context,必传
event,
context
context
})
return {
dbJQL.collection('book').get() // 直接执行数据库操作
......@@ -242,7 +242,7 @@ exports.main = async (event, context) => {
> HBuilderX 3.2.11及更高版本支持客户端初始化其他服务空间database实例,此前仅腾讯云云函数环境支持。阿里云云函数环境不支持此用法。
调用`uniCloud.database()`时可以传入对应的服务空间信息(参数同uniCloud.init,参考:[uniCloud.init](uniCloud/init.md?id=init-unicloud))来获取指定服务空间的database实例。
调用`uniCloud.database()`时可以传入对应的服务空间信息(参数同uniCloud.init,参考:[uniCloud.init](init.md?id=init-unicloud))来获取指定服务空间的database实例。
**注意**
......@@ -269,7 +269,7 @@ db.collection('uni-id-users').get()
| clientSecret | String |是 | - | 仅阿里云支持,可以在[uniCloud控制台](https://unicloud.dcloud.net.cn)服务空间列表中查看 |
| endpoint | String |否 | `https://api.bspapp.com` | 服务空间地址,仅阿里云支持。阿里云正式版需将此值设为`https://api.next.bspapp.com` |
| timeout | Number |否 | 5000 | 仅支付宝小程序云支持,请求超时时间(单位:毫秒),默认为5秒。 |
## 创建集合/表的API@createCollection
- 阿里云
......@@ -327,7 +327,7 @@ const resume = db.collection('resume');
| 读 | get | 获取数据表中的记录,如果有使用 where 语句定义查询条件,则会返回匹配结果集 (触发请求) |
| 引用 | doc | 获取对该数据表中指定 id 的记录的引用 |
| 查询条件 | where | 通过指定条件筛选出匹配的记录,可搭配查询指令(eq, gt, in, ...)使用 |
| | skip | 跳过指定数量的文档,常用于分页,传入 offset。clientDB组件有封装好的更易用的分页,[另见](uniCloud/uni-clientdb-component) |
| | skip | 跳过指定数量的文档,常用于分页,传入 offset。clientDB组件有封装好的更易用的分页,[另见](uni-clientdb-component) |
| | orderBy | 排序方式 |
| | limit | 返回的结果集(文档数量)的限制,有默认值和上限值 |
| | field | 指定需要返回的字段 |
......@@ -517,13 +517,13 @@ new db.Geo.MultiPolygon([
## 与传统开发区别@difference
不同于传统开发,连接数据库有单次操作时长限制,目前单次操作时间限制如下。超出此时间会报超时错误。一般情况下在设置了合适的索引时不会遇到超时错误,如何优化查询速度请参考:[数据库性能优化](uniCloud/db-performance.md)
不同于传统开发,连接数据库有单次操作时长限制,目前单次操作时间限制如下。超出此时间会报超时错误。一般情况下在设置了合适的索引时不会遇到超时错误,如何优化查询速度请参考:[数据库性能优化](db-performance.md)
|腾讯云 |阿里云 | 支付宝小程序云 |
|-- |-- |------------|
|5秒 |5秒 | 默认5秒;最大5分钟 |
如果是大数据批处理,可以参考云函数递归调用,连续执行多个云函数处理一个任务[详情查看](uniCloud/cf-functions.md?id=recurrence)
如果是大数据批处理,可以参考云函数递归调用,连续执行多个云函数处理一个任务[详情查看](cf-functions.md?id=recurrence)
## 数据导入导出和备份@dbmigration
......@@ -800,4 +800,4 @@ uniCloud提供的`db_init.json`主要是为了对数据库进行初始化,并
### 云厂商之间的迁移@cross-provider
文档移至:[在云厂商之间迁移数据库](uniCloud/price.md?id=cross-provider-db)
文档移至:[在云厂商之间迁移数据库](price.md?id=cross-provider-db)
......@@ -65,7 +65,7 @@ DCloud为开发者提供了`uni发布平台`,包括网站发布、App发布和
> HBuilderX 2.8.9+,支持前端网页托管管理器管理uniCloud阿里云版,3.5.1起,支持uniCloud腾讯云版。
在菜单视图中,或者在左下角状态栏中,点击`前端网页托管`,可在左侧打开前端网页托管管理器。如下图
<img style="max-width:750px;" src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/%E5%89%8D%E7%AB%AF%E7%BD%91%E9%A1%B5%E6%89%98%E7%AE%A1%E7%AE%A1%E7%90%86%E5%99%A8.jpg"/>
......@@ -278,7 +278,7 @@ web浏览器有跨域限制,A域名的网站如果通过js请求另一个域
如果在更新页面后浏览器访问到的仍是旧页面,可以通过如下流程排查
1. 客户端禁用缓存或无痕模式打开是否正常,如果是就是客户端缓存问题,需要等浏览器缓存失效
1. 客户端禁用缓存或无痕模式打开是否正常,如果是就是客户端缓存问题,需要等浏览器缓存失效
2. 排除了第一步的影响后,访问页面路径后加参数 比如 /admin#/pages/index/index 改为 /admin?v=1#/pages/index/index,如果正常则是cdn缓存问题,在uniCloud前端网页托管**配置页面**刷新缓存即可
## 最佳实践
......@@ -314,4 +314,4 @@ uni-app项目根据路由模式不同需要做不同的配置
## 阿里云CDN安全策略
阿里云前端网页托管在绑定自定义域名后,支持配置CDN安全策略:[https://uniapp.dcloud.net.cn/uniCloud/cdn-security-policy.html](uniCloud/cdn-security-policy.md)
阿里云前端网页托管在绑定自定义域名后,支持配置CDN安全策略:[https://uniapp.dcloud.net.cn/uniCloud/cdn-security-policy.html](cdn-security-policy.md)
## 初始化uniCloud实例@init-unicloud
文档已迁移至:[一个应用访问多个服务空间](uniCloud/concepts/space.md?id=multi-space)
文档已迁移至:[一个应用访问多个服务空间](concepts/space.md?id=multi-space)
## 获取其他服务空间的database@init-db
文档已迁移至:[一个应用访问多个服务空间](uniCloud/hellodb.md?id=init-db)
文档已迁移至:[一个应用访问多个服务空间](hellodb.md?id=init-db)
> 新增于HBuilderX 3.5.2,需先开通[redis](uniCloud/redis-introduction.md)
> 新增于HBuilderX 3.5.2,需先开通[redis](redis-introduction.md)
## JQL Cache Redis
......@@ -49,15 +49,15 @@ uniCloud 提供了 MongoDB 和 Redis 2种数据库。并且提供了联动机制
命中缓存时,clientDB或使用了jql扩展的云函数/云对象会输出以下日志
```js
"当前请求需使用Redis缓存"
"返回Redis内缓存的结果"
"当前请求需使用Redis缓存"
"返回Redis内缓存的结果"
```
未命中缓存时,clientDB或使用了jql扩展的云函数/云对象会输出以下日志
```js
"当前请求需使用Redis缓存"
"未命中Redis缓存,设置Redis缓存"
"当前请求需使用Redis缓存"
"未命中Redis缓存,设置Redis缓存"
```
`JQL Cache Redis`会将缓存配置对应的查询结果缓存到key为`unicloud:jql-cache:${id}:string`的redis缓存内。可以在uniCloud web控制台的redis视图中找到。
......
......@@ -9,7 +9,7 @@
1. JQL 优化了联表查询、Tree查询、虚拟表查询等,比 MongoDB语法更易用
2. 支持 DB Schema,包括各种值域约束和权限校验。无需再开发接口的权限和数据合法性验证代码
本文主要讲解云函数中如何使用 JQL 。详细的 JQL 语法另见文档:[JQL数据库操作](uniCloud/jql.md)
本文主要讲解云函数中如何使用 JQL 。详细的 JQL 语法另见文档:[JQL数据库操作](jql.md)
## 为云函数添加jql扩展库
......@@ -46,7 +46,7 @@ HBuilderX 3.4以前的开发者,需要在云函数的package.json内手动添
exports.main = async (event, context) => {
const dbJQL = uniCloud.databaseForJQL({ // 获取JQL database引用,此处需要传入云函数的event和context,必传
event,
context
context
})
const bookQueryRes = await dbJQL.collection('book').where("name=='三国演义'").get() // 直接执行数据库操作
return {
......
......@@ -144,7 +144,7 @@ const res = await db.collection('article')
.get()
```
上述代码使用add方法将publish_date时间戳转为日期类型,再用dateToString将上一步的日期按照时区'+0800'(北京时间),格式化为`4位年-2位月-2位日`格式,完整格式化参数请参考[dateToString](uniCloud/cf-database-aggregate-operator.md?id=datetostring)
上述代码使用add方法将publish_date时间戳转为日期类型,再用dateToString将上一步的日期按照时区'+0800'(北京时间),格式化为`4位年-2位月-2位日`格式,完整格式化参数请参考[dateToString](cf-database-aggregate-operator.md?id=datetostring)
上述代码执行结果为
......
......@@ -20,4 +20,4 @@
- 此处代码运行不受DB Schema的权限控制,移植代码到实际业务中注意在schema中配好permission
- 不支持clientDB的action
- 数据库查询有最大返回条数限制,详见:[limit](https://uniapp.dcloud.net.cn/uniCloud/cf-database?id=limit)
- 详细JQL语法,请参考:[JQL](uniCloud/jql.md)
\ No newline at end of file
- 详细JQL语法,请参考:[JQL](jql.md)
\ No newline at end of file
......@@ -108,7 +108,7 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
## JQL包含的模块@module
这里选择以使用了JQL完整功能clientDB为例,JQL操作数据库的流程如下。不同使用场景的区别请参考: [JQL的使用场景](uniCloud/jql.md?id=scene)
这里选择以使用了JQL完整功能clientDB为例,JQL操作数据库的流程如下。不同使用场景的区别请参考: [JQL的使用场景](jql.md?id=scene)
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/clientdb.jpg)
......@@ -116,9 +116,9 @@ sql写法,对js工程师而言有学习成本,而且无法处理非关系型
你可以在以下几种场景使用JQL
- 客户端clientDB,包括js内以及unicloud-db组件内,参考:[clientDB](uniCloud/clientdb.md)
- HBuilderX JQL数据库管理器,参考:[JQL数据库管理器](uniCloud/jql-runner.md)
- 启用了jql扩展的云函数,参考:[云函数内使用JQL](uniCloud/jql-cloud.md)
- 客户端clientDB,包括js内以及unicloud-db组件内,参考:[clientDB](clientdb.md)
- HBuilderX JQL数据库管理器,参考:[JQL数据库管理器](jql-runner.md)
- 启用了jql扩展的云函数,参考:[云函数内使用JQL](jql-cloud.md)
### 不同场景的区别
......@@ -236,7 +236,7 @@ db.collection('user').where('_id==$cloudEnv_uid').get()
```js
db.collection('user').where({
_id: db.getCloudEnv('$cloudEnv_uid')
_id: db.getCloudEnv('$cloudEnv_uid')
}).get()
```
......@@ -372,7 +372,7 @@ db.collection('user').where({
const res = await db.collection('goods').where(`${new RegExp(searchVal, 'i')}.test(name)`).get()
```
如果使用[unicloud-db组件](uniCloud/unicloud-db.md)写法如下
如果使用[unicloud-db组件](unicloud-db.md)写法如下
```html
<template>
......@@ -381,7 +381,7 @@ const res = await db.collection('goods').where(`${new RegExp(searchVal, 'i')}.te
<unicloud-db v-slot:default="{data, loading, error, options}" collection="goods" :where="where">
<view v-if="error">{{error.message}}</view>
<view v-else>
</view>
</unicloud-db>
</view>
......@@ -443,7 +443,7 @@ const res = await db.collection(order, 'book').get() // 将获取的order表的
**关联查询后的返回结果数据结构如下:**
> 通过HBuilderX提供的[JQL数据库管理](uniCloud/jql-runner.md)功能方便的查看联表查询时返回数据的结构
> 通过HBuilderX提供的[JQL数据库管理](jql-runner.md)功能方便的查看联表查询时返回数据的结构
主表某字段foreignKey指向副表时
......@@ -464,7 +464,7 @@ const res = await db.collection(order, 'book').get() // 将获取的order表的
{
"主表字段名1": "xxx",
"主表字段名2": "xxx",
"主表内被副表foreignKey指向的字段名": {
"主表内被副表foreignKey指向的字段名": {
"副表1表名": [{ // 一个主表字段可能对应多个副表字段的foreignKey
"副表1字段名1": "xxx",
"副表1字段名2": "xxx",
......@@ -685,7 +685,7 @@ db.collection('order')
不止js,`<unicloud-db>`组件也支持所有`jql`功能,包括联表查询。
在前端页面调试JQL联表查询且不过滤字段时会受权限影响,导致调试比较困难。可以通过HBuilderX提供的[JQL数据库管理](uniCloud/jql-runner.md)功能方便的查看联表查询时的虚拟联表结构。
在前端页面调试JQL联表查询且不过滤字段时会受权限影响,导致调试比较困难。可以通过HBuilderX提供的[JQL数据库管理](jql-runner.md)功能方便的查看联表查询时的虚拟联表结构。
如上述查询可以直接在`JQL文件`中执行以下代码查看完整的返回字段
......@@ -845,7 +845,7 @@ const res = await db.collection(order, 'book').where('uid==$cloudEnv_uid').get()
#### 设置字段别名@lookup-field-alias
联表查询时也可以在field内对字段进行重命名,写法和简单查询时别名写法类似,`原字段名 as 新字段名`即可。[简单查询时的字段别名](uniCloud/jql.md?id=alias)
联表查询时也可以在field内对字段进行重命名,写法和简单查询时别名写法类似,`原字段名 as 新字段名`即可。[简单查询时的字段别名](jql.md?id=alias)
仍以上述order、book两个表为例,以下查询将联表查询时order表的quantity字段重命名为order_quantity,将book表的title重命名为book_title、author重命名为book_author
......@@ -1037,7 +1037,7 @@ db.collection(comment, user)
**关联查询后的数据结构如下:**
> 通过HBuilderX提供的[JQL数据库管理](uniCloud/jql-runner.md)功能方便的查看联表查询时返回数据的结构
> 通过HBuilderX提供的[JQL数据库管理](jql-runner.md)功能方便的查看联表查询时返回数据的结构
主表某字段foreignKey指向副表时
......@@ -1058,7 +1058,7 @@ db.collection(comment, user)
{
"主表字段名1": "xxx",
"主表字段名2": "xxx",
"副表foreignKey指向的主表字段名": {
"副表foreignKey指向的主表字段名": {
"副表1表名": [{ // 一个主表字段可能对应多个副表字段的foreignKey
"副表1字段名1": "xxx",
"副表1字段名2": "xxx",
......@@ -1183,9 +1183,9 @@ const res = await db.collection('test')
jql支持两种类型的查询条件,以下内容有助于理解两种的区别,实际书写的时候无需过于关心是简单查询条件还是复杂查询条件,**JQL会自动进行选择**
where内还支持使用云端环境变量,详情参考:[云端环境变量](uniCloud/jql.md?id=variable)
where内还支持使用云端环境变量,详情参考:[云端环境变量](jql.md?id=variable)
在 unicloud-db 组件中使用where查询 [参考](uniCloud/unicloud-db.md?id=where)
在 unicloud-db 组件中使用where查询 [参考](unicloud-db.md?id=where)
#### 简单查询条件@simple-where
......@@ -1223,7 +1223,7 @@ where内还支持使用云端环境变量,详情参考:[云端环境变量](
> HBuilderX 3.1.0起支持
复杂查询内可以使用[数据库运算方法](uniCloud/jql-operator-example.md)。需要注意的是,与云函数内使用数据库运算方法不同jql内对数据库运算方法的用法进行了简化。
复杂查询内可以使用[数据库运算方法](jql-operator-example.md)。需要注意的是,与云函数内使用数据库运算方法不同jql内对数据库运算方法的用法进行了简化。
例:数据表test内有以下数据
......@@ -1333,7 +1333,7 @@ db.collection('book')
.skip(20) // 跳过前20条
.limit(20) // 获取20条
.get()
// 上述用法对应的分页条件为:每页20条取第2页
```
......@@ -1355,7 +1355,7 @@ db.collection('book')
field可以指定字符串,也可以指定一个对象。
field中可以使用所有[数据库运算方法](uniCloud/jql-operator-example.md)
field中可以使用所有[数据库运算方法](jql-operator-example.md)
- 字符串写法:列出字段名称,多个字段以半角逗号做分隔符。比如`db.collection('book').field("title,author")`,查询结果会返回`_id``title``author`3个字段的数据。字符串写法,`_id`是一定会返回的
......@@ -1570,7 +1570,7 @@ db.collection('order,book')
### 各种字段运算方法@db-operator
`HBuilderX 3.1.0`起,JQL支持在云端数据库对字段进行一定的操作运算之后再返回,详细可用的方法列表请参考:[数据库运算方法](uniCloud/jql.md?id=aggregate-operator)
`HBuilderX 3.1.0`起,JQL支持在云端数据库对字段进行一定的操作运算之后再返回,详细可用的方法列表请参考:[数据库运算方法](jql.md?id=aggregate-operator)
> 需要注意的是,为方便书写,JQL内将数据库运算方法的用法进行了简化(相对于云函数内使用数据库运算方法而言)。用法请参考上述链接
......@@ -1649,7 +1649,7 @@ const db = uniCloud.database()
}).catch(err => {
console.error(err)
})
// 上述写法等价于
const db = uniCloud.database()
db.collection('order')
......@@ -1894,7 +1894,7 @@ db.collection("department").get({
showCancel: false
})
}).finally(() => {
})
```
......@@ -2011,7 +2011,7 @@ db.collection("department")
showCancel: false
})
}).finally(() => {
})
```
......@@ -2053,7 +2053,7 @@ db.collection("department")
showCancel: false
})
}).finally(() => {
})
```
......@@ -2205,7 +2205,7 @@ db.collection("department").get({
分组统计有groupBy和groupField。和传统sql略有不同,传统sql没有单独的groupField。
JQL的groupField里不能直接写field字段,只能使用[分组运算方法](uniCloud/jql.md?id=accumulator)来处理字段,常见的累积器计算符包括:count(*)、sum(字段名称)、avg(字段名称)。更多分组运算方法[详见](uniCloud/clientdb.md?id=accumulator)
JQL的groupField里不能直接写field字段,只能使用[分组运算方法](jql.md?id=accumulator)来处理字段,常见的累积器计算符包括:count(*)、sum(字段名称)、avg(字段名称)。更多分组运算方法[详见](clientdb.md?id=accumulator)
其中count(*)是固定写法。
......@@ -2271,9 +2271,9 @@ const res = await db.collection('table1').groupBy('field1,field2').groupField('s
#### 求和、求均值示例
groupBy内也可以使用数据库运算方法对数据进行处理,为方便书写,clientDB内将数据库运算方法的用法进行了简化(相对于云函数内使用数据库运算方法而言)。用法请参考:[数据库运算方法](uniCloud/jql.md?id=aggregate-operator)
groupBy内也可以使用数据库运算方法对数据进行处理,为方便书写,clientDB内将数据库运算方法的用法进行了简化(相对于云函数内使用数据库运算方法而言)。用法请参考:[数据库运算方法](jql.md?id=aggregate-operator)
groupField内可以使用分组运算方法对分组结果进行统计,所有可用的累计方法请参考[分组运算方法](uniCloud/jql.md?id=accumulator),下面以sum(求和)和avg(求均值)为例介绍如何使用
groupField内可以使用分组运算方法对分组结果进行统计,所有可用的累计方法请参考[分组运算方法](jql.md?id=accumulator),下面以sum(求和)和avg(求均值)为例介绍如何使用
使用sum方法可以对数据进行求和统计。以上述数据为例,如下写法对不同班级进行分数统计
......@@ -2527,7 +2527,7 @@ res = {
}
```
完整数据库运算方法列表请参考:[JQL内可使用的数据库运算方法](uniCloud/jql.md?id=aggregate-operator)
完整数据库运算方法列表请参考:[JQL内可使用的数据库运算方法](jql.md?id=aggregate-operator)
#### count权限控制
......@@ -2832,7 +2832,7 @@ db.collection("user")
})
})
.finally(() => {
})
```
......@@ -2916,7 +2916,7 @@ db.collection("table1")
showCancel: false
})
}).finally(() => {
})
```
......@@ -3111,7 +3111,7 @@ unicloud-db组件也支持使用getTemp方法,结合multiSend可以与其他
## MongoDB聚合操作@aggregate
JQL API支持使用聚合操作读取数据,关于聚合操作请参考[聚合操作](uniCloud/cf-database-aggregate.md)
JQL API支持使用聚合操作读取数据,关于聚合操作请参考[聚合操作](cf-database-aggregate.md)
例:取status等于1的随机20条数据
......@@ -3170,7 +3170,7 @@ db.collection('test').update({
这些工具大幅减少了开发者的开发工作量和重复劳动。
**`DB Schema`是`JQL`紧密相关的配套,掌握JQL离不开详读[DB Schema文档](uniCloud/schema)。**
**`DB Schema`是`JQL`紧密相关的配套,掌握JQL离不开详读[DB Schema文档](schema)。**
**下面示例中使用了注释,实际使用时schema是一个标准的json文件不可使用注释。**完整属性参考[schema字段](https://uniapp.dcloud.net.cn/uniCloud/schema?id=segment)
......@@ -3202,7 +3202,7 @@ db.collection('test').update({
### permission@permission
`DB Schema`中的数据权限配置功能非常强大,请详读[DB Schema的数据权限控制](uniCloud/schema?id=permission)
`DB Schema`中的数据权限配置功能非常强大,请详读[DB Schema的数据权限控制](schema?id=permission)
在配置好`DB Schema`的权限后,JQL的查询写法,尤其是非`JQL`的聚合查询写法有些限制,具体如下:
- 不使用聚合时collection方法之后需紧跟一个where方法,这个where方法内传入的条件必须满足权限控制规则
......@@ -3389,7 +3389,7 @@ action的作用是在执行前端发起的数据库操作时,额外触发一
- 正确:`db.action("someactionname").collection('table1')`
- 错误:`db.collection('table1').action("someactionname")`
**尽量不要在action中使用全局变量,如果一定要用请务必确保自己已经阅读并理解了[云函数的启动模式](uniCloud/cf-functions.md?id=launchtype)**
**尽量不要在action中使用全局变量,如果一定要用请务必确保自己已经阅读并理解了[云函数的启动模式](cf-functions.md?id=launchtype)**
如果使用`<unicloud-db>组件`,该组件也有action属性,设置action="someactionname"即可。
```html
......@@ -3413,7 +3413,7 @@ action是一种特殊的云函数,它不占用服务空间的云函数数量
* 在此处开启数据库事务,万一操作数据库失败,可以在after里回滚
* 使用throw阻止运行
* 如果权限或字段值域校验不想配在schema和validateFunction里,也可以在这里做校验
- after在数据库操作执行后触发,JQL操作数据库后触发after里的代码。after的常用用途:
* 对将要返回给前端的数据进行二次处理
* 也可以在此处处理错误,回滚数据库事务
......@@ -3443,7 +3443,7 @@ module.exports = {
before: async(state,event)=>{
// state为当前数据库操作状态其格式见下方说明
// event为传入云函数的event对象
// before内可以操作state上的newData对象对数据进行修改,比如:
state.newData.create_time = Date.now()
// 指定插入或修改的数据内的create_time为Date.now()
......@@ -3456,11 +3456,11 @@ module.exports = {
// event为传入云函数的event对象
// error为执行操作的错误对象,如果没有错误error的值为null
// result为执行command返回的结果
if(error) {
throw error
}
// after内可以对result进行额外处理并返回
result.msg = 'hello'
return result
......
......@@ -71,4 +71,4 @@ test()
### 异步行为@async-process
阿里云、腾讯云nodejs8在云函数return之后其余逻辑会被冻结不再执行。腾讯云nodejs12表现恰好相反,云函数return之后还会等待其余逻辑执行后才会将此云函数实例空闲出来。详情见:[keepRunningAfterReturn](uniCloud/cf-functions.md?id=keep-running)
\ No newline at end of file
阿里云、腾讯云nodejs8在云函数return之后其余逻辑会被冻结不再执行。腾讯云nodejs12表现恰好相反,云函数return之后还会等待其余逻辑执行后才会将此云函数实例空闲出来。详情见:[keepRunningAfterReturn](cf-functions.md?id=keep-running)
\ No newline at end of file
......@@ -8,7 +8,7 @@
uniCloud的定价、套餐内容、服务SLA,是由云厂商直接公布的。DCloud公司不会加价。uniCloud已经上线近3年,DCloud一直以良心方式服务开发者,努力降低应用的开发门槛、提高应用的开发效率。
- 选择支付宝小程序云作为服务商时,有一个免费服务空间。除最高档套餐外,其余套餐可享受一次“0元购”,有效期为3个月。支持超出套餐后按量计费。
- 选择阿里云作为服务商时,有一个免费服务空间。更多服务空间需要付费,付费支持套餐和按量两种模式。
- 选择腾讯云作为服务商时,需付费购买套餐,用量超出套餐后可开启按量计费,详情参考[腾讯云基础套餐](uniCloud/price?id=tencent-package)
- 选择腾讯云作为服务商时,需付费购买套餐,用量超出套餐后可开启按量计费,详情参考[腾讯云基础套餐](price?id=tencent-package)
付费用户享受云厂商提供的服务协议SLA,[详见](https://uniapp.dcloud.net.cn/uniCloud/agreement)
......@@ -20,8 +20,8 @@ uniCloud的定价、套餐内容、服务SLA,是由云厂商直接公布的。
|计费方式 |付费方式 |超限策略 |详情 |
|:-: |:-: |:-: |:-: |
|包年包月 |购买包年包月套餐,每月金额和可用量上限固定。 |某资源超过套餐额度时会提前停止该资源使用,下个月恢复,亦可及时升配和转按量 |参考 [阿里云包月套餐](uniCloud/price?id=aliyun-package)|
|按量计费 |先充值,根据使用量扣余额,每日结算。不用的余额可退 |余额不足会停服,充值后恢复。亦可额外设置某资源指标的阈值,超阈值停用该资源 [详见](#aliyun-postpay-quota) |参考 [阿里云按量计费](uniCloud/price?id=aliyun-postpay)|
|包年包月 |购买包年包月套餐,每月金额和可用量上限固定。 |某资源超过套餐额度时会提前停止该资源使用,下个月恢复,亦可及时升配和转按量 |参考 [阿里云包月套餐](price?id=aliyun-package)|
|按量计费 |先充值,根据使用量扣余额,每日结算。不用的余额可退 |余额不足会停服,充值后恢复。亦可额外设置某资源指标的阈值,超阈值停用该资源 [详见](#aliyun-postpay-quota) |参考 [阿里云按量计费](price?id=aliyun-postpay)|
包年包月套餐,适于业务稳定、套餐资源使用均衡的场景。
......@@ -29,7 +29,7 @@ uniCloud的定价、套餐内容、服务SLA,是由云厂商直接公布的。
### 免费服务空间
阿里云为每个账号提供了1个免费服务空间,以方便产品开发测试及体验。具体额度请阅读下方[包年包月套餐](uniCloud/price.md?id=aliyun-package)中的开发者版。
阿里云为每个账号提供了1个免费服务空间,以方便产品开发测试及体验。具体额度请阅读下方[包年包月套餐](price.md?id=aliyun-package)中的开发者版。
**免费额度注意事项:**
- 阿里云免费服务空间有效期默认一个月,到期时需主动续期(到期前15天可续),不续期会被停服释放
......@@ -224,12 +224,12 @@ uniCloud的定价、套餐内容、服务SLA,是由云厂商直接公布的。
阿里云公测版已于2022年11月15日公告,于21日停止新建,于2023年1月22日下线。详见:[https://ask.dcloud.net.cn/article/40144](https://ask.dcloud.net.cn/article/40144)
阿里云提供了公测版一键迁移到正式版的功能。执行一键迁移后云存储、云函数、数据库都会被迁移到新服务空间。迁移过程中云函数、数据库均可正常访问,云存储无法写入(删除或上传文件),
详见:[阿里云公测版迁移正式版](uniCloud/aliyun-migrate-business.md)
详见:[阿里云公测版迁移正式版](aliyun-migrate-business.md)
## 腾讯云@tencent
**使用腾讯云Nodejs12版本时,务必仔细阅读此文档:[keepRunningAfterReturn](uniCloud/cf-functions.md?id=keep-running)**
**使用腾讯云Nodejs12版本时,务必仔细阅读此文档:[keepRunningAfterReturn](cf-functions.md?id=keep-running)**
腾讯云于2022年8月12日更新了计费方式。
......@@ -572,7 +572,7 @@ uniCloud的定价、套餐内容、服务SLA,是由云厂商直接公布的。
### 数据库迁移@cross-provider-db
目前可以使用云数据库的导入导出进行迁移,迁移数据库之前可以使用导出db_init.json功能将所有集合及索引导出。再使用数据导入导出功能进行迁移。导入导出请参考:[数据导入导出和备份](uniCloud/hellodb.md?id=dbmigration)
目前可以使用云数据库的导入导出进行迁移,迁移数据库之前可以使用导出db_init.json功能将所有集合及索引导出。再使用数据导入导出功能进行迁移。导入导出请参考:[数据导入导出和备份](hellodb.md?id=dbmigration)
> 也可以直接使用第三方封装好的插件:[unicloud数据库一键搬家工具,支持阿里云与腾讯云互转。支持跨账号转。](https://ext.dcloud.net.cn/plugin?id=6089)
......
......@@ -76,7 +76,7 @@ HBuilderX内使用运行菜单运行到小程序时会连接本地调试服务
* 方式2:在外部浏览器安装跨域插件,详见:[https://ask.dcloud.net.cn/article/35267](https://ask.dcloud.net.cn/article/35267)。要跨域的地址,详见上述文档中小程序配置安全域名章节。
- `2021年9月16日`之前阿里云跨域配置不对云存储及前端网页托管生效,表现为云存储中图片绘制到canvas会[污染画布](https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial/Using_images#Using_other_canvas_elements),前端网页托管的网页不可在iframe中使用。
- `2021年9月16日`之后阿里云跨域配置可以对前端网页托管生效,**仅对前端网页托管的自定义域名生效,不对默认域名生效,如何绑定自定义域名请参考:[前端网页托管绑定自定义域名](uniCloud/hosting.md?id=domain)**,设置之后可能需要几分钟才会生效。如果你在之前已经设置了跨域域名和前端网页托管的自定义域名,需要重新设置一次跨域域名才能生效。
- `2021年9月16日`之后阿里云跨域配置可以对前端网页托管生效,**仅对前端网页托管的自定义域名生效,不对默认域名生效,如何绑定自定义域名请参考:[前端网页托管绑定自定义域名](hosting.md?id=domain)**,设置之后可能需要几分钟才会生效。如果你在之前已经设置了跨域域名和前端网页托管的自定义域名,需要重新设置一次跨域域名才能生效。
- `2022年12月2日`阿里云正式版跨域配置支持使用通配符,限制配置9个跨域域名。正式版默认允许localhost跨域
- `2023年2月3日`阿里云正式版跨域配置对云存储生效,如果此前已配置跨域配置下次进行修改时会同步设置到云存储。
......@@ -90,7 +90,7 @@ HBuilderX内使用运行菜单运行到小程序时会连接本地调试服务
### 前端网页托管
uniCloud支持前端静态网页托管,在HBuilderX中点发行菜单,生成Web,将生成的前端文件部署在uniCloud的前端网页托管内即可[详情参考](uniCloud/hosting.md)
uniCloud支持前端静态网页托管,在HBuilderX中点发行菜单,生成Web,将生成的前端文件部署在uniCloud的前端网页托管内即可[详情参考](hosting.md)
需要注意的是你仍需在[uniCloud web控制台](https://unicloud.dcloud.net.cn) 配置绑定安全域名(见上一章节),这样前端网页的js才能访问云函数。
......
......@@ -13,9 +13,9 @@ Hello uniCloud部署了2套,分别连接uniCloud的阿里云版和腾讯云版
* Hello uniCloud 支付宝小程序云版地址:[https://hellounicloud.dcloud.net.cn/alipay/](https://hellounicloud.dcloud.net.cn/alipay/#/)
* Hello uniCloud 阿里云版地址:[https://hellounicloud.dcloud.net.cn/#/](https://hellounicloud.dcloud.net.cn/#/)
* Hello uniCloud 腾讯云版地址:[https://hellounicloud.dcloud.net.cn/tcb/](https://hellounicloud.dcloud.net.cn/tcb/)
由于该示例未适配pc宽屏,如使用pc浏览器打开地址,建议F12打开控制台,使用手机模式预览。
- apk地址(发布在uniCloud的云存储上)
* Hello uniCloud 支付宝小程序云版地址:[apk下载](https://env-00jx4sbgbkj5.normal.cloudstatic.cn/apk/__UNI__HelloUniCloud_1113203614.apk)
* Hello uniCloud 阿里云版地址:[apk下载](https://m3w.cn/__uni__5c6d4e4)
......@@ -35,22 +35,22 @@ Hello uniCloud 的源码地址:[https://ext.dcloud.net.cn/plugin?id=4082](http
- 按照法律要求,开通云服务器需实名认证,如未认证请根据提示完成
- 创建一个服务空间,创建完成后回到向导刷新列表,选择这个服务空间(创建服务空间可能需要几十秒的时间,可以在web控制台查看是否创建完成。)
- 按照向导提示,将hello uniCloud项目下的云函数、数据库schema上传部署到服务空间,并执行db_init初始化数据库
**说明**
- 第一次创建腾讯云服务空间时会为用户创建腾讯云账号并跳转到腾讯云实名界面,等待实名认证审核之后可以开通服务空间。若腾讯云实名认证提示身份证下已创建过多账户,则需要在腾讯云官网注销不用的账户。
- 阿里云每个账号可以有一个开发者版免费空间,此空间资源较少仅能用于测试开发。腾讯云无免费空间。
- 首次创建支付宝小程序云时,需前往uniCloud控制台开通支付宝小程序云服务空间,开通服务空间时需使用支付宝扫码授权开通支付宝小程序云服务。
3. 运行 hello uniCloud项目
- 在运行菜单运行项目,浏览器、app、小程序均可。uniCloud项目是云端一体的,运行前端后控制台会同时出现前端和云端的控制台。
## 开发自己的第一个uniCloud项目
1. 创建uniCloud项目
HBuilderX中新建项目,选择uni-app项目,并勾选`启用uniCloud`,在右侧选择服务供应商(支付宝小程序云、阿里云、腾讯云)
项目名称随意,比如 firstunicloud
2. 关联服务空间
......@@ -59,7 +59,7 @@ Hello uniCloud 的源码地址:[https://ext.dcloud.net.cn/plugin?id=4082](http
对项目根目录`uniCloud`点右键选择`关联云服务空间`,绑定之前创建的服务空间,或者新建一个服务空间。
3. 创建云函数/云对象
`uniCloud`项目创建并绑定服务空间后,开发者可以创建云函数(云对象是云函数的一种,云函数可泛指普通云函数和云对象)。
......@@ -160,7 +160,7 @@ HBuilderX自带一个云函数本地运行环境,运行项目时也默认选
**注意**
- 运行与发行云函数只能使用HBuilderX的菜单,不可使用`package.json`内的命令
- 如果HBuilderX菜单运行不能满足需求可以考虑自行初始化服务空间[服务空间初始化](uniCloud/init.md)
- 如果HBuilderX菜单运行不能满足需求可以考虑自行初始化服务空间[服务空间初始化](init.md)
- 虽然uni-app支持vscode等其他ide开发,但因为uniCloud对安全性要求极高,仅支持使用HBuilderX开发
- HBuilderX 也支持 cli。[详见](https://hx.dcloud.net.cn/cli/README)
......
......@@ -93,7 +93,7 @@
## 在云函数中使用
如何在云函数中使用redis,请参考[扩展能力Redis](uniCloud/redis.md)
如何在云函数中使用redis,请参考[扩展能力Redis](redis.md)
## FAQ
......
......@@ -4,9 +4,9 @@ Redis(Remote Dictionary Server),是一种充分利用内存的数据库。
为了保证效率,数据都是缓存在内存中,同时redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步,即使宕机,也可以恢复数据。所以redis即做到了高性能又实现了安全持久化存储。
redis是key-value存储系统,支持存储的value类型较多,包括:string(字符串)、list(链表)、set(集合)、sorted set 和hash(哈希类型)[详情](uniCloud/redis?id=data-type)
redis是key-value存储系统,支持存储的value类型较多,包括:string(字符串)、list(链表)、set(集合)、sorted set 和hash(哈希类型)[详情](redis?id=data-type)
> 使用腾讯云node12和redis,务必仔细阅读此文档:[keepRunningAfterReturn](uniCloud/cf-functions.md?id=keep-running)
> 使用腾讯云node12和redis,务必仔细阅读此文档:[keepRunningAfterReturn](cf-functions.md?id=keep-running)
### Redis和MongoDB的比较
- 读写速度:MongoDB数据存储在磁盘里,读写语法复杂,速度较慢。redis在内存中读写,只根据key访问数据,速度快很多。
......
......@@ -2,7 +2,7 @@
> 2021年11月18日,腾讯云和阿里云均支持
> 使用腾讯云node12和redis,务必仔细阅读此文档:[keepRunningAfterReturn](uniCloud/cf-functions.md?id=keep-running)
> 使用腾讯云node12和redis,务必仔细阅读此文档:[keepRunningAfterReturn](cf-functions.md?id=keep-running)
Redis是一个基于key/value的内存数据库。在项目中通常作为MongoDB等磁盘数据库的补充来搭配使用。
相对于磁盘数据库,Redis的核心优势是快。因为操作内存要比磁盘快的多,并且Redis只支持key/value数据,读写都很快。但Redis没有磁盘数据库丰富的查询等功能。
......@@ -19,7 +19,7 @@ Redis常见使用场景:
## 开通Redis服务@buy
参考[开通redis](uniCloud/redis-buy.md)
参考[开通redis](redis-buy.md)
## 为云函数启用redis扩展库@use-in-function
......@@ -48,7 +48,7 @@ exports.main = async (event, context) => {
-`uni:``dcloud:``unicloud:`为前缀的redis的key,为**官方前缀**。开发者自己的业务所需的key应避免使用这些前缀。
- 调用`uniCloud.redis()`时返回的redis实例对应着一个连接,多次调用时如果存在未断开连接的redis实例则返回此实例。如果不存在redis实例或之前的redis实例已断开连接则返回新的redis实例。
- redis实例创建时并未建立与redis的连接,而是在第一次调用redis方法时才会与redis建立连接。在实际业务中的表现就是一个云函数实例第一次调用redis方法会慢上几毫秒
- 为云函数开启redis扩展会影响云函数固定ip功能,详情参考:[云函数固定出口IP](uniCloud/cf-functions.md?id=eip)
- 为云函数开启redis扩展会影响云函数固定ip功能,详情参考:[云函数固定出口IP](cf-functions.md?id=eip)
## Redis本地运行@local-function
......@@ -3084,7 +3084,7 @@ await redis.quit()
和传统开发不同,云函数实例之间是不互通的,也就是说每个使用redis的函数实例都会和redis建立一个连接,在云函数实例复用时此连接也会复用。
## 最佳实践
### 高并发下抢购/秒杀/防超卖示例@snap-over-sell
......@@ -3139,9 +3139,9 @@ exports.main = async function (event, context) {
* 使用redis的eval方法执行lua脚本判断各个商品库存能否满足购物车购买的数量
* 如果不满足,返回库存不足的商品id
* 如果满足,返回一个空数组
*
*
* eval为原子操作可以在高并发下保证不出错
**/
**/
let checkAndSetStock = `
local cart = {${cart.map(item => `{id='${item.id}',amount=${item.amount}}`).join(',')}}
local amountList = redis.call('mget',${cart.map(item => `'${stockKeyPrefix}${item.id}'`).join(',')})
......
......@@ -387,4 +387,4 @@
+ 修复 本地调试插件 部分情况下客户端连接启用了 JQL 扩展的本地云函数报错的Bug
#### 已归档的历史版本
[更多已归档版本的更新日志](uniCloud/release-archive.md)
\ No newline at end of file
[更多已归档版本的更新日志](release-archive.md)
\ No newline at end of file
......@@ -158,7 +158,7 @@ HBuilderX自带的uniCloud环境内扩展库的能力仅支持到此HBuilderX发
### 公用模块使用注意@diff-common-module
- `HBuilderX 3.0.0`之前需要在云函数内执行`npm install ../common/xxx`安装公共模块,详细请参考[云函数公用模块](uniCloud/cf-common.md)
- `HBuilderX 3.0.0`之前需要在云函数内执行`npm install ../common/xxx`安装公共模块,详细请参考[云函数公用模块](cf-common.md)
- 如果使用`HBuilderX 3.0.0`及以上版本,可以直接在云函数目录右键选择“管理公共模块依赖”进行公共模块的引入
- 如果使用到加密的公共模块则此云函数不可本地运行
- `HBuilderX 3.0.0`版本运行uniCloud项目时,uniCloud本地调试插件会自动进行云函数依赖安装(包括公共模块和package.json里面的其他依赖)
......
......@@ -309,8 +309,8 @@ schema 国际化方案 [详见](https://uniapp.dcloud.net.cn/tutorial/i18n?id=sc
复杂格式说明:
- 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)
- double类型慎重,由于js不能精准处理浮点运算,0.1+0.2=0.30000000000000004。所以涉及金额时,建议使用int而不是double,以分为单位而不是以元为单位存储。比如微信支付默认就是以分为单位。如果使用[uniPay](uniCloud/unipay)处理支付的话,它的默认单位也是分。
- 日期和地理位置在web控制台的数据库管理界面上无法直接在引号里录入值,需参考[文档](quickstart?id=editdb)
- double类型慎重,由于js不能精准处理浮点运算,0.1+0.2=0.30000000000000004。所以涉及金额时,建议使用int而不是double,以分为单位而不是以元为单位存储。比如微信支付默认就是以分为单位。如果使用[uniPay](unipay)处理支付的话,它的默认单位也是分。
- file的json object格式存储文件的基本信息和路径,如下:
```json
{
......@@ -1141,7 +1141,7 @@ rule表达式里支持:
**注意**
- 扩展校验函数不能有其他依赖。有相关需求需使用schema.ext.js来替代。
- 尽量不要在扩展校验函数中使用全局变量,如果一定要用请务必确保自己已经阅读并理解了[云函数的启动模式](uniCloud/cf-functions.md?id=launchtype)
- 尽量不要在扩展校验函数中使用全局变量,如果一定要用请务必确保自己已经阅读并理解了[云函数的启动模式](cf-functions.md?id=launchtype)
如何使用
......
......@@ -82,7 +82,7 @@
**短信测试模板说明**
运营商目前审核比较严格,处于开发阶段的应用可能无法通过运营商的审核。为方便开发者测试短信功能,DCloud 提供了一个测试模板,该模板的templateId为:uni_sms_test,内容为:`【统一应用软件】尊敬的用户,您的验证码是:${code}。5分钟内有效,请尽快验证。请勿泄漏您的验证码。`
运营商目前审核比较严格,处于开发阶段的应用可能无法通过运营商的审核。为方便开发者测试短信功能,DCloud 提供了一个测试模板,该模板的templateId为:uni_sms_test,内容为:`【统一应用软件】尊敬的用户,您的验证码是:${code}。5分钟内有效,请尽快验证。请勿泄漏您的验证码。`
使用该模板的限制:
......@@ -188,9 +188,9 @@ exports.main = async (event, context) => {
### 发送失败注意@fail
- data内如果有`测试``test`等字样,系统可能会被判定为测试用途,不会真正把短信下发到对应手机(此行为由运营商控制,可能真实发送,也可能不发送)
- data内如果有`测试``test`等字样,系统可能会被判定为测试用途,不会真正把短信下发到对应手机(此行为由运营商控制,可能真实发送,也可能不发送)
- 短信内容不可包含★、 ※、 →、 ●等特殊符号,可能会导致短信乱码
- 如果本地运行提示`不支持的模板ID`,请更新到`2.9.9+`版本的HBuilderX
- 如果本地运行提示`不支持的模板ID`,请更新到`2.9.9+`版本的HBuilderX
- 使用同一短信模板给同一个手机号发送短信时,频率不能太高。如果1分钟内超过1次,会被运营商判定为骚扰或短信重发而被拦截,导致短信发送失败
- 尽量使用企业实名认证,个人实名认证的审核更严格,更容易发送失败
......@@ -210,7 +210,7 @@ exports.main = async (event, context) => {
## 群发短信@batch-sms
如有客户关怀、会员服务、电商活动、新品上线等场景需要给用户发送短信时,通过uni-admin群发短信功能,无需开发,及时送达用户。
[群发短信配置](uniCloud/admin.md#batch-sms)
[群发短信配置](../admin.md#batch-sms)
**功能亮点**
......@@ -221,7 +221,7 @@ exports.main = async (event, context) => {
发送前预览短信内容;防止内容错误,提高发送成功率
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/20230109155202.png)
如何使用?查看[群发短信配置](uniCloud/admin.md#batch-sms)
如何使用?查看[群发短信配置](../admin.md#batch-sms)
<style>
.join-group-chat{
......
......@@ -45,7 +45,7 @@ uniCloud腾讯云版支持云存储的文件权限。当上传的文件不希望
在uni-app前端进行云存储的操作(不是在云函数里操作),包括在前端上传、删除文件。
腾讯云支持配置云存储权限,需搭配腾讯云自定义登录使用,详情:[自定义登录](uniCloud/authentication.md)
腾讯云支持配置云存储权限,需搭配腾讯云自定义登录使用,详情:[自定义登录](authentication.md)
支付宝小程序云与阿里云不支持控制前端访问云储存的权限
......@@ -110,7 +110,7 @@ uniCloud腾讯云版支持云存储的文件权限。当上传的文件不希望
#### 示例代码
<!--
<!--
cloudPath: 'test-admin.jpeg',
filePath: filePath,
onUploadProgress: function(progressEvent) {
......@@ -757,7 +757,7 @@ let result = await uniCloud.downloadFile({
使用阿里云作为服务商时,云存储支持直接使用**restful api**对资源进行处理,下表列出支持的操作类型。
如果你的数据库及云函数使用腾讯云,也是可以使用阿里云云存储的。详细用法参考:[连接多个服务空间](uniCloud/init.md)
如果你的数据库及云函数使用腾讯云,也是可以使用阿里云云存储的。详细用法参考:[连接多个服务空间](init.md)
|功能 |操作参数 |参考文档 |
|:-: |:-: |:-: |
......
文档地址已迁移至:[unicloud-db 组件](uniCloud/unicloud-db.md)
\ No newline at end of file
文档地址已迁移至:[unicloud-db 组件](unicloud-db.md)
\ No newline at end of file
> 本文档为uni-id 3.x 版本文档。适用于老用户。
> HBuilderX 3.5以上版本用户,请另行查阅 [uni-id 4+ 版本文档](uniCloud/uni-id/summary.md)。如何从旧版本升级到uni-id-pages请查看:[升级到uni-id-pages](uniCloud/uni-id-pages.md#m-to-co)
> HBuilderX 3.5以上版本用户,请另行查阅 [uni-id 4+ 版本文档](../uni-id/summary.md)。如何从旧版本升级到uni-id-pages请查看:[升级到uni-id-pages](../uni-id/app.md)
# 需求背景
......@@ -11,7 +11,7 @@
`uni-id``uniCloud`开发者提供了简单、统一、可扩展的用户管理能力封装。
[clientDB](uniCloud/clientDB)[DB Schema](uniCloud/schema)[uni-starter](https://ext.dcloud.net.cn/plugin?id=5057)[uniCloud admin](uniCloud/admin),这些产品都基于`uni-id`的账户体系。可以说`uni-id`是uniCloud不可或缺的基础能力。
[clientDB](../clientDB)[DB Schema](../schema)[uni-starter](https://ext.dcloud.net.cn/plugin?id=5057)[uniCloud admin](../admin),这些产品都基于`uni-id`的账户体系。可以说`uni-id`是uniCloud不可或缺的基础能力。
# 组成部分
......@@ -55,7 +55,7 @@ uniCloud框架底层,会自动在callfunction时传递`uni-id`的token(uni-a
规范,还可以让上下游充分协同。插件市场会出现各种数据迁移插件,比如把从discuz里把用户迁移到`uni-id`中的插件,相信围绕这套规范的产业链会非常活跃。
事实上,[clientDB](uniCloud/clientDB)[DB Schema](uniCloud/schema)[uni-starter](https://ext.dcloud.net.cn/plugin?id=5057)[uniCloud admin](uniCloud/admin)等重要uniCloud产品,以及插件市场上各种优秀的轮子,都是基于`uni-id`的。
事实上,[clientDB](../clientDB)[DB Schema](../schema)[uni-starter](https://ext.dcloud.net.cn/plugin?id=5057)[uniCloud admin](../admin)等重要uniCloud产品,以及插件市场上各种优秀的轮子,都是基于`uni-id`的。
# 现状和未来
......@@ -63,7 +63,7 @@ uniCloud框架底层,会自动在callfunction时传递`uni-id`的token(uni-a
- 注册、登录、发送短信验证码、密码加密保存、修改密码、token管理(短信验证码功能需要HBuilderX 2.8.3+)
- App手机号一键认证,免验证码
- 三方登录:App中的微信登录和Apple ID、微信小程序中的微信登录、支付宝小程序中的支付宝账户登录
- 三方登录:App中的微信登录和Apple ID、微信小程序中的微信登录、支付宝小程序中的支付宝账户登录
- rbac权限角色体系
关于还缺少的部分,哪些DCloud在完善,哪些希望开发者给共同完善开源项目,计划与边界公布如下:
......@@ -116,7 +116,7 @@ uni-id的云端配置文件在`uniCloud/cloudfunctions/common/uni-config-center/
注意:
- **config.json是一个标准json文件,不支持注释**
- 如果不希望使用config.json初始化而是想自行传入参数(一般不推荐这么做),可以使用`createInstance`方法[uniID.createInstance](uniCloud/uni-id.md?id=create-instance)
- 如果不希望使用config.json初始化而是想自行传入参数(一般不推荐这么做),可以使用`createInstance`方法[uniID.createInstance](../uni-id.md?id=create-instance)
> 在云函数URL化的场景无法获取客户端平台信息,可以在调用uni-id相关接口之前(推荐在云函数入口)通过修改context.PLATFORM手动传入客户端平台信息
......@@ -241,10 +241,10 @@ tokenExpiresThreshold用于指定token还有多长时间过期时自动刷新tok
参考:
- [保存token及其过期时间](uniCloud/uni-id?id=save-token)
- [删除token及其过期时间](uniCloud/uni-id?id=remove-token)
- [保存token及其过期时间](#save-token)
- [删除token及其过期时间](#remove-token)
用户token为明文存储,可以在token内查看用户相关信息。uniCloud也提供了一个接口用于直接获取token内的用户信息,参考:[uniCloud.getCurrentUserInfo](uniCloud/client-sdk.md?id=client-getcurrentuserinfo)
用户token为明文存储,可以在token内查看用户相关信息。uniCloud也提供了一个接口用于直接获取token内的用户信息,参考:[uniCloud.getCurrentUserInfo](../client-sdk.md?id=client-getcurrentuserinfo)
uniCloud.getCurrentUserInfo接口大致逻辑如下,需要注意的是某些小程序平台不支持atob,getCurrentUserInfo接口内已包含atob的polyfill
......@@ -258,7 +258,7 @@ const userInfo = atob(userSegment) // '{"uid":"61a593ba91a750000166f78d","role":
> 新增于uni-id 3.3.12
**前提介绍:**
**前提介绍:**
uni-app vue2版本app端对应的platform为`app-plus`(HBuilderX 3.4.9起 vue2版本app端对应的platform值也调整为`app`),uni-app vue3版本app端对应的platform为`app`。此改动引发了一些问题,比如在uni-id内使微信登录会无法匹配对应的平台导致登录报错。
......@@ -298,7 +298,7 @@ uni-app vue2版本app端对应的platform为`app-plus`(HBuilderX 3.4.9起 vue2
> 新增于uni-id 3.3.22
**前提介绍:**
**前提介绍:**
HBuilderX 3.4.9起,uni-app web端对应的platform由`h5`调整为`web`。此改动引发了一些问题,比如在uni-id内将无法获取web平台配置,以及有些基于uni-id扩充功能的项目可能存在不兼容的情况
......@@ -336,7 +336,7 @@ HBuilderX 3.4.9起,uni-app web端对应的platform由`h5`调整为`web`。此
为什么需要角色权限管理?
- 对于后台管理系统,比如[uniCloud admin](/uniCloud/admin),除了超级管理员,不同账号通常需根据职位、责任设定不同的系统权限。
- [clientDB](/uniCloud/database)允许前端直接操作数据库,但部分字段应该是系统计算或管理员设置的,比如文章的阅读数、收藏数及是否加精置顶,这些字段不允许普通用户在前端通过clientDB直接修改,此时也需要通过权限控制来保证系统的安全稳定。
- [clientDB](/uniCloud/database)允许前端直接操作数据库,但部分字段应该是系统计算或管理员设置的,比如文章的阅读数、收藏数及是否加精置顶,这些字段不允许普通用户在前端通过clientDB直接修改,此时也需要通过权限控制来保证系统的安全稳定。
`uni-id`基于经典的RBAC模型实现了角色权限系统。
......@@ -359,7 +359,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。
用户信息存储在`uni-id-users`表中,然后通过`role`字段保存该用户所拥有的所有角色ID,角色ID即角色表(`uni-id-roles`表)中的`role_id`字段,注意不是`_id`字段。
```
```json
{
{
"_id":"5f8428181c229600010389f6",
......@@ -370,7 +370,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。
"NOTICE_ADMIN"
],
"created_date":1602495783272
}
}
}
```
......@@ -418,7 +418,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。
"NOTICE_DEL"
],
"created_date":1602495784372
}
}
}
```
......@@ -429,7 +429,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。
{
"permission": {
"update":"doc._id == auth.uid || 'USER_ADMIN' in auth.role" //用户自己或人事管理员可执行用户表的.update操作
}
}
}
```
......@@ -466,7 +466,7 @@ RBAC:Role-Based Access Control,基于角色的访问控制。
"permission_id":"USER_DEL",
"permission_name":"删除用户",
"created_date":1602495784372
}
}
}
```
......@@ -485,9 +485,9 @@ RBAC:Role-Based Access Control,基于角色的访问控制。
## 其他说明
uni-id针对角色权限模块封装了丰富的API,比如:获取用户角色、获取某角色下的所有权限等,详情参考:[角色权限API](uniCloud/uni-id.md?id=rbac-api)
uni-id针对角色权限模块封装了丰富的API,比如:获取用户角色、获取某角色下的所有权限等,详情参考:[角色权限API](#rbac-api)
> 自`uni-id 3.0.0`起,支持在token内缓存用户的角色权限,默认开启此功能,各登录接口的needPermission参数不再生效。如需关闭请在config内配置`"removePermissionAndRoleFromToken": true`。详情参考:[缓存角色权限](uniCloud/uni-id?id=cache-permission-in-token)。
> 自`uni-id 3.0.0`起,支持在token内缓存用户的角色权限,默认开启此功能,各登录接口的needPermission参数不再生效。如需关闭请在config内配置`"removePermissionAndRoleFromToken": true`。详情参考:[缓存角色权限](#cache-permission-in-token)。
如果不在token内缓存角色权限,可以使用以下方式,在checkToken时返回数据库内对应用户的角色权限信息。
......@@ -517,7 +517,7 @@ function hasPermission(token, permission) {
用法:`uniID.createInstance(Object CreateInstanceOptions);`
CreateInstanceOptions内可以传入云函数context,自`uni-id 3.3.13`起,也可以传入clientInfo参数,作用和context类似。方便在云对象内获取clientInfo后直接传入,[什么是云对象?](uniCloud/cloud-obj.md)
CreateInstanceOptions内可以传入云函数context,自`uni-id 3.3.13`起,也可以传入clientInfo参数,作用和context类似。方便在云对象内获取clientInfo后直接传入,[什么是云对象?](../cloud-obj.md)
```js
// 云函数代码,传入context
......@@ -577,7 +577,7 @@ module.exports = {
**注意**
- 注册成功之后会返回token、tokenExpired,在获取token之后应进行持久化存储,详情参考:[保存token及其有效期](uniCloud/uni-id.md?id=save-token)
- 注册成功之后会返回token、tokenExpired,在获取token之后应进行持久化存储,详情参考:[保存token及其有效期](#save-token)
**参数说明**
......@@ -686,7 +686,7 @@ uniCloud.callFunction({
**注意**
- 登录成功之后会返回token、tokenExpired,在获取token之后应进行持久化存储,详情参考:[保存token及其有效期](uniCloud/uni-id.md?id=save-token)
- 登录成功之后会返回token、tokenExpired,在获取token之后应进行持久化存储,详情参考:[保存token及其有效期](#save-token)
- 登录时请注意自行验证数据有效性
**参数说明**
......@@ -765,7 +765,7 @@ exports.main = async function(event,context) {
- 如果在token内缓存角色权限,建议将此`needUserInfo`参数配置为`false`
- 角色内包含admin时返回的permission是一个空数组,因此判断一个用户是否有权限时应注意admin角色额外进行判断
请务必阅读一下此文档:[关于缓存角色权限的说明](uniCloud/uni-id.md?id=cache-permission-in-token)
请务必阅读一下此文档:[关于缓存角色权限的说明](#cache-permission-in-token)
**响应参数**
......@@ -872,7 +872,7 @@ const {
**注意**
- 登出成功之后应删除持久化存储的token,参考:[客户端删除token及其有效期](uniCloud/uni-id?id=remove-token)
- 登出成功之后应删除持久化存储的token,参考:[客户端删除token及其有效期](#remove-token)
**参数说明**
......@@ -959,12 +959,12 @@ exports.main = async function(event,context) {
passwordConfirmation
} = event
// 校验新密码与确认新密码是否一致
const payload = await uniID.checkToken(event.uniIdToken)
if(payload.code) {
return payload
}
const res = await uniID.updatePwd({
uid: payload.uid,
oldPassword,
......@@ -1004,7 +1004,7 @@ exports.main = async function(event,context) {
if(payload.code) {
return payload
}
const res = await uniID.resetPwd({
uid: payload.uid,
password: '12345678'
......@@ -1782,11 +1782,11 @@ exports.main = async function(event,context) {
### 设置验证码
[设置验证码](uniCloud/uni-id.md?id=setVerifyCode)
[设置验证码](#setVerifyCode)
### 校验验证码
[校验验证码](uniCloud/uni-id.md?id=verifyCode)
[校验验证码](#verifyCode)
### 绑定邮箱
......@@ -1884,7 +1884,7 @@ exports.main = async function(event,context) {
- 需要在config.json内使用微信登录的平台下配置appid和appsecret
- uniId会自动判断客户端平台
- 登录成功之后会返回token、tokenExpired,在获取token之后应进行持久化存储,详情参考:[保存token及其有效期](uniCloud/uni-id.md?id=save-token)
- 登录成功之后会返回token、tokenExpired,在获取token之后应进行持久化存储,详情参考:[保存token及其有效期](#save-token)
- App端获取code不可直接调用`uni.login`,详细用法可以看下面示例
**APP微信登录详细配置流程**
......@@ -2184,7 +2184,7 @@ exports.main = async function(event,context) {
- 需要在config.json内使用QQ登录的平台下配置appid和appsecret
- uniId会自动判断客户端平台
- 登录成功之后会返回token、tokenExpired,在获取token之后应进行持久化存储,详情参考:[保存token及其有效期](uniCloud/uni-id.md?id=save-token)
- 登录成功之后会返回token、tokenExpired,在获取token之后应进行持久化存储,详情参考:[保存token及其有效期](#save-token)
**APP QQ登录详细配置流程**
......@@ -2357,7 +2357,7 @@ export default {
**注意**
- 需要在config.json内支付宝平台下配置appid和privateKey(应用私钥)
- 登录成功之后会返回token、tokenExpired,在获取token之后应进行持久化存储,详情参考:[保存token及其有效期](uniCloud/uni-id.md?id=save-token)
- 登录成功之后会返回token、tokenExpired,在获取token之后应进行持久化存储,详情参考:[保存token及其有效期](#save-token)
- uni.login仅支持使用支付宝小程序登录,不支持app使用支付宝登录,`uniID.loginByAlipay`也只支持小程序登录
**LoginByAlipayOptions参数说明**
......@@ -2507,7 +2507,7 @@ exports.main = async function(event,context) {
**注意**
- 需要在config.json内的 app > oauth > apple 下配置 bundleId
- 登录成功之后会返回token、tokenExpired,在获取token之后应进行持久化存储,详情参考:[保存token及其有效期](uniCloud/uni-id.md?id=save-token)
- 登录成功之后会返回token、tokenExpired,在获取token之后应进行持久化存储,详情参考:[保存token及其有效期](#save-token)
**LoginByAppleOptions参数说明**
......@@ -3297,7 +3297,7 @@ const res = await uniID.forbidAppLogin({
## 验证码表
表名:`opendb-verify-codes`
表名:`opendb-verify-codes`
**uni-id 2.0.0版本以前,使用的表名为uni-verify,2.0.0+起改为新表名**
......@@ -3477,7 +3477,7 @@ errCode和errMsg对照表如下:
## 裂变@fission
`1.1.2`版本起uni-id支持裂变功能,目前仅适用手机号+验证码方式注册可以填写邀请码(inviteCode)接受邀请。裂变相关API请参考[裂变API](uniCloud/uni-id.md?id=fission-api)
`1.1.2`版本起uni-id支持裂变功能,目前仅适用手机号+验证码方式注册可以填写邀请码(inviteCode)接受邀请。裂变相关API请参考[裂变API](#fission-api)
`config.json`内配置了`autoSetInviteCode: true`则在用户注册时会自动给设置不重复的6位邀请码,如果不希望使用自动设置的邀请码可以自行传入`myInviteCode`参数来设置邀请码,需要注意的是要保证邀请码唯一。
......@@ -3599,14 +3599,14 @@ uni-id-users表内存储的password字段为使用hmac-sha1生成的hash值,
`uni-config-center`模块内的uni-id插件内创建`custom-token.js`内容如下:
```js
module.exports = async (tokenObj) => {
module.exports = async (tokenObj) => {
// tokenObj为原始token信息结构如下
// {
// uid: 'abc', // 用户id
// role: [], // 用户角色列表
// permission: [] // 用户权限列表,admin角色的用户权限列表为空数组
// }
tokenObj.customField = 'hello custom token' // 自定义token字段
return tokenObj // 注意务必返回修改后的token对象
}
......@@ -3645,7 +3645,7 @@ uni-id会自动进行语言匹配,无需额外配置
uni-id 3.3.0版本起用户注册时会自动在用户表的记录内标记为注册端用户,如果没有授权登录其他端的话是不可以在其他端登录的
如何授权登录其他端请参考:[授权、禁止用户在特定客户端登录](uniCloud/uni-id?id=authorize-app)
如何授权登录其他端请参考:[授权、禁止用户在特定客户端登录](#authorize-app)
需要注意的是客户端APPID信息是由端上传上来的,并非完全可信,尽量在入口处进行校验。例:
......@@ -3672,7 +3672,7 @@ exports.main = async function(event, context){
> `uni-id 3.3.0`及以上版本
uni-id的config.json支持配置为数组,每项都是一个完整的配置,对不同的配置使用`dcloudAppid`字段进行区分(**此字段与项目内的manifest.json里面的DCloud AppId一致**),uni-id会自动根据客户端的appid来判断该使用哪套配置。如果使用云函数url化请参考:[云函数Url化时使用](uniCloud/uni-id?id=url)
uni-id的config.json支持配置为数组,每项都是一个完整的配置,对不同的配置使用`dcloudAppid`字段进行区分(**此字段与项目内的manifest.json里面的DCloud AppId一致**),uni-id会自动根据客户端的appid来判断该使用哪套配置。如果使用云函数url化请参考:[云函数Url化时使用](#url)
需要注意的是客户端APPID信息是由端上传上来的,并非完全可信,尽量在入口处进行校验。例:
......@@ -3686,7 +3686,7 @@ exports.main = async function(event, context){
**示例**
> 数组每一项都是一个完整的配置文件,全部选项请参考:[uni-id 配置](uniCloud/uni-id?id=config)
> 数组每一项都是一个完整的配置文件,全部选项请参考:[uni-id 配置](#config)
**注意:如果允许同一账号在不同端使用相同的账号+密码登录需要将不同端的passwordSecret设置成一样的**
......@@ -3755,7 +3755,7 @@ exports.main = async function(event, context) {
## 存储用户三方平台凭证
uni-id 3.3.29起支持,此功能无需额外开发,升级uni-id到此版本后会自动依赖[uni-open-bridge-common](uni-open-bridge.md#common),在用户使用微信、QQ等三方登录时会自动将用户在三方平台的凭证存储到`opendb-open-data`表,以便其他功能使用这些凭证。注意升级不要忘记上传`uni-open-bridge-common`模块。
uni-id 3.3.29起支持,此功能无需额外开发,升级uni-id到此版本后会自动依赖[uni-open-bridge-common](../uni-open-bridge.md#common),在用户使用微信、QQ等三方登录时会自动将用户在三方平台的凭证存储到`opendb-open-data`表,以便其他功能使用这些凭证。注意升级不要忘记上传`uni-open-bridge-common`模块。
由于保存三方凭证只在登录时进行,而存量用户可能需要等到token过期才会重新登录,因此无法确保所有三方平台登录的用户都有凭证信息。
......@@ -3767,7 +3767,7 @@ uni-id 3.3.29起支持,此功能无需额外开发,升级uni-id到此版本
## 自2.x.x版本升级到3.x.x@m2to3
3.0.0版本起uni-id默认将缓存用户角色权限到token内,关于缓存角色权限的说明请参考:[缓存角色权限](uniCloud/uni-id?id=cache-permission-in-token)。从2.x.x版本升级到3.x.x版本需要根据自己需求分别处理。
3.0.0版本起uni-id默认将缓存用户角色权限到token内,关于缓存角色权限的说明请参考:[缓存角色权限](#cache-permission-in-token)。从2.x.x版本升级到3.x.x版本需要根据自己需求分别处理。
- 如果不希望缓存角色权限到token内,需要在config.json内配置`"removePermissionAndRoleFromToken": true`
- 如果希望升级为缓存角色权限到token内的方案,可以按照以下步骤迁移
......
......@@ -17,7 +17,7 @@ keyword: 手机号
`HBuilderX 3.4.0`起,一键登录相关功能移至扩展库`uni-cloud-verify`内。在一段时间内无论开发者是否使用扩展库云函数都可以正常使用`uniCloud.getPhoneNumber`。HBuilderX 3.4.0及之后的版本上传云函数时如果没有指定使用`uni-cloud-verify`扩展库的云函数将无法调用uniCloud.getPhoneNumber接口。
关于扩展库的说明见:[云函数扩展库](uniCloud/cf-functions.md?id=extension)
关于扩展库的说明见:[云函数扩展库](../cf-functions.md?id=extension)
在云函数的package.json内添加`uni-cloud-verify`的引用即可为云函数启用此扩展,无需做其他调整,完整的package.json示例如下:
......@@ -41,16 +41,16 @@ keyword: 手机号
客户端调用一键登录接口会获取如下结果
```js
{
"target": {
"id": "univerify",
"description": "一键登录",
"authResult": {
"openid": "xxx",
"access_token": "xxx"
}
}
}
{
"target": {
"id": "univerify",
"description": "一键登录",
"authResult": {
"openid": "xxx",
"access_token": "xxx"
}
}
}
```
使用上面结果中的`openid``access_token`即可在`云函数`内调用接口获取手机号
......@@ -140,7 +140,7 @@ xhr.send(JSON.stringify({
access_token: 'xxx', // 客户端一键登录接口返回的access_token
openid: 'xxx' // 客户端一键登录接口返回的openid
}));
// 云函数,下面仅展示客户端使用post方式发送content-type为application/json请求的场景
exports.main = async function(event){
let body = event.body
......@@ -198,23 +198,23 @@ const sign = hmac.digest('hex')
// 云函数验证签名,此示例中以接受GET请求为例作演示
const crypto = require('crypto')
exports.main = async function (event){
const secret = 'your-secret-string' // 自己的密钥不要直接使用示例值,且注意不要泄露
const hmac = crypto.createHmac('sha256', secret);
let params = event.queryStringParameters
const sign = params.sign
delete params.sign
const signStr = Object.keys(params).sort().map(key => {
return `${key}=${params[key]}`
}).join('&')
hmac.update(signStr);
if(sign!==hmac.digest('hex')){
throw new Error('非法访问')
}
const {
access_token,
openid
......
......@@ -43,7 +43,7 @@ HBuilderX中敲下`udb`代码块,得到如下代码,然后通过collection
|:-|:-|:-|
|v-slot:default||查询状态(失败、联网中)及结果(data)|
|ref|string|vue组件引用标记|
|spaceInfo|Object|服务空间信息,新增于`HBuilderX 3.2.11`。同uniCloud.init参数,参考:[uniCloud.init](uniCloud/init.md?id=init-unicloud)|
|spaceInfo|Object|服务空间信息,新增于`HBuilderX 3.2.11`。同uniCloud.init参数,参考:[uniCloud.init](init.md?id=init-unicloud)|
|collection|string|表名。支持输入多个表名,用 `,` 分割,自`HBuilderX 3.2.6`起也支持传入tempCollection组成的数组|
|field|string|指定要查询的字段,多个字段用 `,` 分割。不写本属性,即表示查询所有字段。支持用 oldname as newname方式对返回字段重命名|
|where|string|查询条件,对记录进行过滤。[见下](/uniCloud/unicloud-db?id=where)|
......@@ -278,7 +278,7 @@ export default {
// id = this.tempstr 或 name != null
// this.sWhere = "id=='" + this.tempstr + "' || name != null"
// 组件上配置了 loadtime = "manual", 这里需要手动加载数据
this.$nextTick(() => {
this.$refs.udb.loadData()
......@@ -297,7 +297,7 @@ export default {
<unicloud-db v-slot:default="{data, loading, error, options}" collection="goods" :where="where">
<view v-if="error">{{error.message}}</view>
<view v-else>
</view>
</unicloud-db>
</view>
......
> 本文档为`uni-pay 1.x`版本文档。适用于老项目。
> 新项目请另行查阅 [uni-pay 2.x 版本文档](uniCloud/uni-pay.md)。
> 新项目请另行查阅 [uni-pay 2.x 版本文档](uni-pay.md)。
## 简介
......@@ -71,7 +71,7 @@ const unipayIns = unipay.initWeixinV3({
mchId: 'your mchId',
v3Key: 'you parterner key',
appCertPath: path.resolve(__dirname, 'your appCertPath'),
// appCertContent: "",
// appCertContent: "",
appPrivateKeyPath: path.resolve(__dirname, 'your appPrivateKeyPath'),
// appPrivateKeyContent: "",
})
......@@ -118,13 +118,13 @@ const unipayIns = unipay.initWeixin({
// 以证书放在云函数index.js同级的cert目录下为例,index.js内可以按照下面这个写
const fs = require('fs');
const path = require('path');
const fs = require('fs');
const path = require('path');
const unipayIns = unipay.initWeixin({
appId: 'your appId',
mchId: 'your mchId',
key: 'you parterner key',
pfx: fs.readFileSync(path.resolve(__dirname, 'cert/xxx.p12'))
pfx: fs.readFileSync(path.resolve(__dirname, 'cert/xxx.p12'))
})
```
......@@ -325,7 +325,7 @@ uniCloud.callFunction({
**订单状态**
微信支付:
微信支付:
SUCCESS—支付成功
REFUND—转入退款
NOTPAY—未支付
......@@ -697,7 +697,7 @@ exports.main = async function (event) {
let res = await unipayIns.verifyPaymentNotify(event)
// 处理完毕其他业务
// 注意如果处理成功需要严格按照下面的格式进行返回,否则厂商会持续通知
// 微信支付V3处理成功之后
// 微信支付V3处理成功之后
return {
mpserverlessComposedResponse: true,
statusCode: 200,
......@@ -709,22 +709,22 @@ exports.main = async function (event) {
message: '成功'
})
}
// 微信支付V2处理成功之后
// 微信支付V2处理成功之后
return {
mpserverlessComposedResponse: true,
mpserverlessComposedResponse: true,
statusCode: 200,
headers: {
'content-type': 'text/xml;charset=utf-8'
},
body: `<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>`
}
// 支付宝处理成功后
// 支付宝处理成功后
return {
mpserverlessComposedResponse: true,
statusCode: 200,
headers: {
'content-type': 'text/plain'
},
headers: {
'content-type': 'text/plain'
},
body: "success"
}
}
......@@ -764,21 +764,21 @@ exports.main = async function (event) {
exports.main = async function (event) {
let res = await unipayIns.verifyRefundNotify(event)
// 注意如果处理成功需要严格按照下面的格式进行返回,否则厂商会持续通知
// 微信处理成功之后
// 微信处理成功之后
return {
mpserverlessComposedResponse: true,
statusCode: 200,
headers: {
'content-type': 'text/xml;charset=utf-8'
},
body: `<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>`
statusCode: 200,
headers: {
'content-type': 'text/xml;charset=utf-8'
},
body: `<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>`
}
// 支付宝处理成功后
// 支付宝处理成功后
return {
mpserverlessComposedResponse: true,
statusCode: 200,
headers: {
'content-type': 'text/plain'
'content-type': 'text/plain'
},
body: "success"
}
......
......@@ -17,7 +17,7 @@ keyword: 手机号
`HBuilderX 3.4.0`起,一键登录相关功能移至扩展库`uni-cloud-verify`内。在一段时间内无论开发者是否使用扩展库云函数都可以正常使用`uniCloud.getPhoneNumber`。HBuilderX 3.4.0及之后的版本上传云函数时如果没有指定使用`uni-cloud-verify`扩展库的云函数将无法调用uniCloud.getPhoneNumber接口。
关于扩展库的说明见:[云函数扩展库](uniCloud/cf-functions.md?id=extension)
关于扩展库的说明见:[云函数扩展库](cf-functions.md?id=extension)
在云函数的package.json内添加`uni-cloud-verify`的引用即可为云函数启用此扩展,无需做其他调整,完整的package.json示例如下:
......@@ -41,16 +41,16 @@ keyword: 手机号
客户端调用一键登录接口会获取如下结果
```js
{
"target": {
"id": "univerify",
"description": "一键登录",
"authResult": {
"openid": "xxx",
"access_token": "xxx"
}
}
}
{
"target": {
"id": "univerify",
"description": "一键登录",
"authResult": {
"openid": "xxx",
"access_token": "xxx"
}
}
}
```
使用上面结果中的`openid``access_token`即可在`云函数`内调用接口获取手机号
......@@ -142,7 +142,7 @@ xhr.send(JSON.stringify({
access_token: 'xxx', // 客户端一键登录接口返回的access_token
openid: 'xxx' // 客户端一键登录接口返回的openid
}));
// 云函数,下面仅展示客户端使用post方式发送content-type为application/json请求的场景
exports.main = async function(event){
let body = event.body
......@@ -202,23 +202,23 @@ const sign = hmac.digest('hex')
// 云函数验证签名,此示例中以接受GET请求为例作演示
const crypto = require('crypto')
exports.main = async function (event){
const secret = 'your-secret-string' // 自己的密钥不要直接使用示例值,且注意不要泄露
const hmac = crypto.createHmac('sha256', secret);
let params = event.queryStringParameters
const sign = params.sign
delete params.sign
const signStr = Object.keys(params).sort().map(key => {
return `${key}=${params[key]}`
}).join('&')
hmac.update(signStr);
if(sign!==hmac.digest('hex')){
throw new Error('非法访问')
}
const {
access_token,
openid
......@@ -267,7 +267,7 @@ exports.main = async function (event){
```
云函数费用(天) = 资源使用量 * 0.000110592 + 调用次数 * 0.0133 / 10000 + 出网流量 * 0.8
= 云函数内存(单位为G) * 云函数平均单次执行时长(单位为秒) * 调用次数 + 调用次数 * 0.0133 / 10000 + 出网流量 * 0.8
= 0.5G * 0.2S * 10000 * 0.000110592 + 10000 * 0.0133/10000 + 10000 * 2 * 0.8 / (1024 * 1024)
= 0.5G * 0.2S * 10000 * 0.000110592 + 10000 * 0.0133/10000 + 10000 * 2 * 0.8 / (1024 * 1024)
= 0.110592 + 0.0133 + 0.0152587890625
= 0.1391507890625(元)
≈ 0.139(元)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册