提交 20e9e6bb 编写于 作者: 雪洛's avatar 雪洛

Merge branch 'next'

......@@ -128,6 +128,7 @@ context对象的属性清单如下:
|CLIENTIP |string |客户端IP。如果调用来源是其他服务器,会返回调用方的ip |
|CLIENTUA |string |客户端userAgent。注意非本地运行环境下客户端getSystemInfoSync也会获取ua参数并上传给云函数,但是云函数会从http请求头里面获取ua而不是clientInfo里面的ua |
|uniIdToken |string |客户端uni-id token字符串,新增于HBuilderX 3.5.1。 |
|requestId |string |当前请求id,新增于HBuilderX 3.5.5。 |
除了上述属性,如果是uni-app客户端通过callfunction访问云函数,那么context还会追加一批客户端信息。
- HBuilderX 3.4.9前,context 添加了一批大写属性,如APPID、OS。
......
......@@ -286,13 +286,17 @@ errMsg用于存放具体错误信息,包括展示给开发者、终端用户
|uniCloud.deleteFile() |云函数删除云存储的文件 [详情](uniCloud/storage?id=clouddeletefile) |
|uniCloud.getTempFileURL() |获取云存储文件的临时路径 [详情](uniCloud/storage?id=cloudgettempfileurl) |
|uniCloud.customAuth() |使用云厂商自定义登录,仅腾讯云支持[详情](uniCloud/authentication.md?id=cloud-custom-auth) |
|uniCloud.callFunction() |云函数/云对象中调用另一个云函数 [见下](?id=callbyfunction) |
|uniCloud.callFunction() |云函数/云对象中调用另一个云函数 [见下](#callbyfunction) |
|uniCloud.importObject() |云函数/云对象中调用另一个云对象 [详情](cloud-obj.md?id=call-by-cloud) |
|uniCloud.httpclient |云函数中通过http访问其他系统 [见下](uniCloud/cf-functions?id=httpclient) |
|uniCloud.httpclient |云函数中通过http访问其他系统 [见下](#httpclient) |
|uniCloud.sendSms() |发送短信,需添加扩展库 [详见](uniCloud/send-sms.md) |
|uniCloud.getPhoneNumber() |获取一键登录手机号,需添加扩展库 [详见](uniCloud/univerify.md?id=cloud) |
|uniCloud.init() |获取指定服务空间的uniCloud实例 [详见](uniCloud/concepts/space.md?id=multi-space) |
|uniCloud.logger |云函数中打印日志到[uniCloud web控制台](https://unicloud.dcloud.net.cn/)的日志系统(非HBuilderX控制台)[详情](rundebug.md?id=uniCloudlogger) |
|uniCloud.httpProxyForEip |使用云厂商代理访问http服务(阿里云固定IP方案),仅阿里云云端环境支持 [详见](#http-proxy-for-eip),新增于`HBuilderX 3.5.5`|
|uniCloud.getRequestList |获取当前云函数实例内正在处理的请求Id列表 [详见](#get-request-list),新增于`HBuilderX 3.5.5`|
|uniCloud.getClientInfos |获取当前云函数实例内正在处理的请求对应的客户端信息列表 [详见](#get-client-infos),新增于`HBuilderX 3.5.5`|
|uniCloud.getCloudInfos |获取当前云函数实例内正在处理的请求对应的云端信息列表 [详见](#get-cloud-infos),新增于`HBuilderX 3.5.5`|
## 错误对象@uni-cloud-error
......@@ -427,6 +431,88 @@ exports.main = async (event, context) => {
```
## 其他API
### 获取请求id列表@get-request-list
非单实例多并发场景下列表长度为1,仅有的一个requestId表示当前请求的requestId。单实例多并发场景下会返回正在处理的所有请求的requestId列表。如需获取当前请求的requestId参考:[云函数context](cf-callfunction.md#context)[云对象获取当前请求的requestId](cloud-obj.md#get-request-id)
**示例**
```js
uniCloud.getRequestList() // ['3228166e-3c17-4d58-9707-xxxxxxxx']
```
### 获取客户端信息列表#get-client-infos
非单实例多并发场景下列表长度为1,仅有的一个cloudInfo表示当前请求的客户端信息。单实例多并发场景下返回正在处理的所有请求的客户端信息列表。
```js
const clientInfos = uniCloud.getClientInfos()
clientInfos = [{
appId: '__UNI_xxxxx',
requestId: '3228166e-3c17-4d58-9707-xxxxxxxx'
// ...
}]
```
**返回值**
getClientInfos返回的信息,是在客户端的[uni.getSystemInfo](/api/system/info.md#getsysteminfo)的基础之上,增加了一些额外的信息。
除了`getSystemInfo`返回字段外,还包含以下信息
|属性名 |类型 |说明 |
|-- |-- |-- |
|clientIP |string |客户端ip |
|userAgent|string |客户端ua,注意非本地运行环境下客户端getSystemInfoSync也会获取ua参数并上传给云对象,但是云对象会从http请求头里面获取ua而不是clientInfo里面的ua|
|source |string |调用来源,返回值见下。 |
|scene |string |场景值。客户端[uni.getLaunchOptionsSync](/api/plugins/getLaunchOptionsSync.md#getlaunchoptionssync)返回的scene参数, |
|requestId|string |请求Id,可以使用此字段筛选出当前请求的客户端信息 |
云函数调用来源,它的值域为:
|取值 |说明 |
|-- |-- |
|client |uni-app客户端导入云对象调用 |
|function |由其他云函数或云对象调用 |
|http |云对象URL化后通过http访问调用|
|timing |定时任务调用云对象 |
**注意事项**
- 客户端上报的信息在理论上存在被篡改可能,实际业务中应验证前端传来的数据的合法性
- 除了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)
### 获取云端信息@get-cloud-infos
非单实例多并发场景下列表长度为1,仅有的一个cloudInfo表示当前请求的云端信息。单实例多并发场景下返回正在处理的所有请求的云端信息列表。
**示例**
```js
const cloudInfos = uniCloud.getCloudInfos()
cloudInfos = [{
provider: 'aliyun',
spaceId: 'xxxxx',
functionName: 'xxx',
functionType: 'xxxx',
requestId: '3228166e-3c17-4d58-9707-xxxxxxxx'
}]
```
**返回值**
|参数名 |类型 |必备 |说明 |
|-- |-- |-- |-- |
|provider |string |是 |服务空间供应商,阿里云为:`aliyun`,腾讯云为:`tencent`|
|spaceId |string |是 |服务空间Id |
|functionName |string |是 |云对象名称,新增于 |
|functionType |string |是 |云对象此值固定为`cloudobject`,新增于 |
|requestId |string |是 |请求Id,可以使用此字段筛选出当前请求的云端信息 |
## 扩展库@extension
uniCloud的api中,有些api对应的实现,其代码体积较大,且这些功能并不是每一个云函数都会使用。为了方便开发者控制云函数的体积,设计了`uniCloud扩展库`的概念。
......@@ -771,6 +857,8 @@ exports.main = async function() {
### 固定出口IP@eip
#### 腾讯云@tencent-eip
serverless默认是没有固定的服务器IP的,因为有很多服务器资源在后台供随时调用,每次调用到哪个服务器、哪个ip都不固定。
但一些三方系统,要求配置固定ip白名单,比如微信公众号的js sdk,此时只能提供固定ip地址。
......@@ -792,6 +880,115 @@ serverless默认是没有固定的服务器IP的,因为有很多服务器资
建议已开通redis的服务空间先将云函数关联redis扩展再开通固定出口IP,**2022年7月20日起新上传的云函数会默认开启vpc功能,如需旧云函数和新云函数保持一致可以把旧云函数关联redis扩展后上传一次,注意这样操作会改变旧云函数的固定出口IP**
#### 阿里云@aliyun-eip
> 新增于 HBuilderX 3.5.5,仅阿里云支持
uniCloud.httpProxyForEip ,其原理是通过代理请求获得固定出口IP的能力。IP为轮转不固定,因此三方服务要求使用白名单时开发者需要将代理服务器可能的IP均加入到白名单中,见下方代理服务器列表。此外对于代理的域名有限制,当前仅持`weixin.qq.com`泛域名。若开发者有其他域名代理需求,发送邮件到service@dcloud.io申请。
代理服务器IP列表
```
39.100.3.155
47.92.39.39
47.92.67.205
47.92.25.106
47.92.68.159
```
如需在获取微信公众号access_token场景使用,请将上述ip配置到`微信公众平台 -> 基本配置 -> IP白名单`内,相关链接:[微信公众平台](https://mp.weixin.qq.com/)
##### 发送Get请求@http-proxy-get
**用法**
```js
uniCloud.httpProxyForEip.get(url: String, params?: Object)
```
**示例**
```js
await uniCloud.httpProxyForEip.get(
'https://api.weixin.qq.com/cgi-bin/token',
{
grant_type: 'client_credential',
appid: 'xxxx',
secret: 'xxxx'
}
)
```
##### 发送POST请求携带表单数据@http-proxy-post-form
注意,此接口以`application/x-www-form-urlencoded`格式发送数据而不是`multipart/form-data`
**用法**
```js
uniCloud.httpProxyForEip.postForm(url: String, data?: Object, headers?: Object)
```
**示例**
```js
uniCloud.httpProxyForEip.postForm(
'https://www.example.com/search',
{
q: 'nodejs',
cat: '1001'
}
)
```
##### 发送POST请求携带JSON数据@http-proxy-post-json
`application/json`格式post数据
**用法**
```js
uniCloud.httpProxyForEip.postJson(url: String, json?: Object, headers?: Object)
```
**示例**
```js
uniCloud.httpProxyForEip.postJson(
'https://www.example.com/search',
{
q: 'nodejs',
cat: '1001'
}
)
```
##### POST通用数据@http-proxy-post
**用法**
```js
uniCloud.httpProxyForEip.post(url: String, text?: String, headers?: Object)
```
**示例**
```js
uniCloud.httpProxyForEip.post(
'https://www.example.com/search',
'abcdefg',
{
"Content-Type": "text/plain"
}
)
```
**注意**
- 不支持发送multipart格式的内容
- 代理请求超时时间为5秒
- 上述接口支持本地运行
### 单实例多并发@concurrency
> 仅阿里云支持
......
......@@ -19,6 +19,7 @@ uniCloud分为客户端和云端两部分,有些接口名称相同,参数也
|uniCloud.init() |同时使用多个服务空间时初始化额外服务空间 [详情](init.md) |
|uniCloud.addInterceptor() |新增拦截器 [详情](#add-interceptor) |
|uniCloud.removeInterceptor() |移除拦截器 [详情](#remove-interceptor) |
|uniCloud.interceptObject() |拦截云对象请求 [详情](#intercept-object) |
|uniCloud.onResponse() |监听服务端(云函数、云对象、clientDB)响应 [详情](#on-response) |
|uniCloud.offResponse() |移除监听服务端(云函数、云对象、clientDB)响应 [详情](#off-response) |
|uniCloud.onNeedLogin() |监听需要登录事件 [详情](#on-need-login) |
......@@ -71,7 +72,7 @@ console.log(uniCloud.getCurrentUserInfo().role.indexOf('admin')>-1); // 如果
> 新增于HBuilderX 3.1.20
接口形式:`uniCloud.addInterceptor(String apiName, Object interceptorMap)`
接口形式:`uniCloud.addInterceptor(String apiName, Object interceptor)`
**平台兼容性**
......@@ -85,9 +86,9 @@ console.log(uniCloud.getCurrentUserInfo().role.indexOf('admin')>-1); // 如果
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| apiName | string| 是 | 要拦截的Api名称,可选值:callFunction、database、uploadFile |
| interceptorMap| object| 是 | 要添加的拦截器 |
| interceptor| object| 是 | 要添加的拦截器 |
**interceptorMap参数说明**
**interceptor参数说明**
|参数名 |类型 |必填 |默认值 |说明 |平台差异说明 |
|--- |--- |--- |--- |--- |--- |
......@@ -120,16 +121,16 @@ uniCloud.addInterceptor('callFunction', {
> 新增于HBuilderX 3.1.20
接口形式:`uniCloud.removeInterceptor(String apiName, Object interceptorMap)`
接口形式:`uniCloud.removeInterceptor(String apiName, Object interceptor)`
**入参说明**
| 字段 | 类型 | 必填| 说明 |
| --- | --- | --- | --- |
| apiName | string| 是 | 要拦截的Api名称,可选值:callFunction、database、uploadFile |
| interceptorMap| object| 是 | 要移除的拦截器,选填,不传递此参数时移除此Api所有拦截器 |
| interceptor| object| 是 | 要移除的拦截器,选填,不传递此参数时移除此Api所有拦截器 |
**interceptorMap参数说明**
**interceptor参数说明**
|参数名 |类型 |必填 |默认值 |说明 |平台差异说明 |
|--- |--- |--- |--- |--- |--- |
......@@ -167,6 +168,55 @@ uniCloud.removeInterceptor('callFunction', {
})
```
### 拦截云对象请求intercept-object
> 新增于HBuilderX 3.5.5
接口形式:`uniCloud.interceptObject(Object interceptor)`
**interceptor参数说明**
|参数名 |类型 |必填 |默认值 |说明 |平台差异说明 |
|--- |--- |--- |--- |--- |--- |
|invoke |Function |否 | |拦截前触发 | |
|success |Function |否 | |成功回调拦截 | |
|fail |Function |否 | |失败回调拦截 | |
|complete |Function |否 | |完成回调拦截 | |
**invoke**拦截器内将会收到以下形式的参数
```js
{
objectName: "", // 云对象名称
methodName: "", // 云对象的方法名称
params: [] // 参数列表
}
```
**success**拦截器内将会收到以下形式的参数
```js
{
objectName: "", // 云对象名称
methodName: "", // 云对象的方法名称
params: [], // 参数列表
result: {} // 云对象响应结果
}
```
**fail**拦截器内将会收到以下形式的参数
```js
{
objectName: "", // 云对象名称
methodName: "", // 云对象的方法名称
params: [], // 参数列表
error: new Error() // 错误对象
}
```
**complete**拦截器内将会收到success或fail拦截器相同的参数,具体以云函数是否执行成功为准
### 监听云端响应@on-response
> 新增于HBuilderX 3.4.13
......
......@@ -385,6 +385,25 @@ module.exports = {
}
```
### 获取当前请求id@get-request-id
**接口形式**
`this.getUniCloudRequestId()`
**示例**
```js
module.exports = {
_after: function(error, result) {
if(error) {
const requestId = this.getUniCloudRequestId()
// log(requestId, error) 出错时记录日志,log方法需自行实现
}
}
}
```
### 获取url化时的http信息@get-http-info
> 新增于HBuilderX 3.5.2
......
......@@ -2,7 +2,7 @@
开发者应经常查阅自己的慢查询,修复问题,保证业务系统的健康稳定。
在数据库语句执行超过一定时间(**腾讯云为5秒,阿里云为3秒**)仍不能返回结果后,阿里云甚至会报错`operation exceeded time limit`**如果对数据库超时时间有更高的需求,建议使用腾讯云。**
在数据库语句执行超过一定时间(**腾讯云、阿里云均为5秒**)仍不能返回结果后,数据库请求会报超时错误。
这里介绍如何进行查询优化以避免此类问题。
......
......@@ -509,7 +509,7 @@ new db.Geo.MultiPolygon([
|腾讯云 |阿里云 |
|-- |-- |
|5秒 |3秒 |
|5秒 |5秒 |
如果是大数据批处理,可以参考云函数递归调用,连续执行多个云函数处理一个任务[详情查看](uniCloud/cf-functions.md?id=recurrence)
......
......@@ -27,7 +27,7 @@ uniCloud提供包月、按量计费两种计费方式(仅腾讯云),具体
|云函数定时触发最小间隔 |1小时 |- |
|云存储容量 |10GB |- |
|云数据库容量 |100GB |- |
|单次数据库执行时长限制 |3秒 |**不可申请调整** |
|单次数据库执行时长限制 |5秒 |**不可申请调整** |
尤其注意阿里云的cdn确实是全免费的,这些免费资源可用于正常公司业务,阿里云不允许开发者使用这些免费的存储及CDN资源来开展图床类业务。
......
......@@ -289,6 +289,32 @@ const hour = getOffsetDate(8).getHours()
}
```
## 运行云对象时传配置运行测试参数@run-obj-param
> 新增于HBuilderX 3.5.5
右键点击云对象时选择`运行-本地云对象``调试运行-本地云对象`时,会自动创建运行参数文件`${objName}.param.js`,可在此文件内以以下格式配置参数,配置完毕后再次运行即可。
其中`const clientInfo = {xxx}`为模拟客户端信息。完整clientInfo列表请参考:[getClientInfo](cloud-obj.md#get-client-info)
`login('xxx', 'xxx')`用于指定调用的方法名和参数。
```js
const clientInfo = { // 模拟clientInfo
uniPlatform: 'web',
source: 'client', // 调用来源,不传时默认为 client
clientIP: '127.0.0.1', // 客户端ip,不传时默认为 127.0.0.1
userAgent: 'xx MicroMessenger/xxx' // 客户端ua,不传时默认为 HBuilderX
uniIdToken: 'xxx',
}
login('name-demo', 'password-demo') // 调用login方法传入参数'name-demo'和'password-demo'
```
**注意**
- 此文件并非可执行的js文件,仅用来配置参数,因此不可在文件内定义变量并使用
- 如果存在多个方法、参数配置运行时会使用第一个
## 断点调试云函数
> HBuilderX 3.2.10起,本地运行云函数及客户端连接本地云函数支持断点调试
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册