diff --git a/docs/uniCloud/_sidebar.md b/docs/uniCloud/_sidebar.md index acaa926c292b8bc6f69cdc32ccfabd54776cbd25..b42aa9ee3914632637792c35b9950042308b9b0c 100644 --- a/docs/uniCloud/_sidebar.md +++ b/docs/uniCloud/_sidebar.md @@ -71,6 +71,7 @@ * [DCloud行业认证服务商](https://ask.dcloud.net.cn/article/39388) * [学习资料](uniCloud/learning.md) * [常见问题](uniCloud/faq.md) +* [已知问题](uniCloud/known-issue.md) * [微信云开发转uniCloud](uniCloud/wx2unicloud.md) * [uniCloud产品服务协议](uniCloud/agreement.md) * [更新日志](uniCloud/release.md) diff --git a/docs/uniCloud/cf-callfunction.md b/docs/uniCloud/cf-callfunction.md index 0d8388e93932e3deb766b3cc1bbc5619f8616745..14274972322f7d9607f429d0300f5706331a73bf 100644 --- a/docs/uniCloud/cf-callfunction.md +++ b/docs/uniCloud/cf-callfunction.md @@ -111,20 +111,24 @@ exports.main = async (event, context) => { - 阿里云event大小不可超过1MB - 腾讯云event大小不可超过6MB -### context对象 +### context对象@context - `context` 对象包含了本次请求的上下文,包括客户端的ip、ua、appId等信息,以及云函数的环境情况、调用来源source等信息。 context对象的属性清单如下: -|属性名称 |类型 |说明 | -|-- |-- |-- | -|SPACEINFO |object |服务空间信息 | -| |- spaceId |string |服务空间id | -| |- provider |string |服务空间供应商:aliyun|tencent | -|SOURCE |string |云函数调用来源 [详见](?id=context-source) | -|FUNCTION_NAME |string |获取云函数名称 | -|CLIENTIP |string |客户端IP。如果调用来源是其他服务器,会返回调用方的ip| +|属性名称 |类型 |说明 | +|-- |-- |-- | +|SPACEINFO |object |服务空间信息 | +| |- spaceId |string |服务空间id | +| |- provider |string |服务空间供应商:aliyun|tencent | +|SOURCE |string |云函数调用来源 [详见](?id=context-source) | +|FUNCTION_NAME |string |获取云函数名称 | +|FUNCTION_TYPE |string |获取云函数类型,对于云函数来说,这里一定会返回`cloudfunction`,新增于HBuilderX 3.5.1。 | +|FUNCTION_RUNTIME_VERSION |string |云函数sdk版本,本地调试时随HBuilderX版本变动,云端一直保持和最新HBuilderX一致。新增于HBuilderX 3.5.1 | +|CLIENTIP |string |客户端IP。如果调用来源是其他服务器,会返回调用方的ip | +|CLIENTUA |string |客户端userAgent。 | +|uniIdToken |string |客户端uni-id token字符串,新增于HBuilderX 3.5.1。 | 除了上述属性,如果是uni-app客户端通过callfunction访问云函数,那么context还会追加一批客户端信息。 - HBuilderX 3.4.9前,context 添加了一批大写属性,如APPID、OS。 diff --git a/docs/uniCloud/cf-functions.md b/docs/uniCloud/cf-functions.md index 039276cbe95c50dbe33de2ab06b841c002b86277..c826740fe8baf24c43022524a38ef35b4ea0b696 100644 --- a/docs/uniCloud/cf-functions.md +++ b/docs/uniCloud/cf-functions.md @@ -772,7 +772,7 @@ package.json是一个标准json文件,不可带注释。下面是一个package } ``` -其中cloudfunction-config字段是云函数配置,支持的配置如下 +### cloudfunction-config@cloudfunction-config ```js { @@ -790,11 +790,12 @@ package.json是一个标准json文件,不可带注释。下面是一个package }], // 云函数Url化path部分,阿里云需要以/http/开头 "path": "", - "runtime": "" // nodejs版本,可选Nodejs8、Nodejs12,默认:Nodejs8 + "runtime": "", // nodejs版本,可选Nodejs8、Nodejs12,默认:Nodejs8 + "keepRunningAfterReturn": true // 是否在云函数return之后继续执行,仅腾讯云nodejs12生效,详情见下方说明 } ``` -**关于triggers** +#### triggers@triggers 阿里云定时触发的cron表达式不支持代表年的第七位,但是在package.json内配置时仍需将第七位设置为*。 @@ -810,7 +811,36 @@ package.json内统一了腾讯阿里的配置,两个平台都需要配置为 } ``` -**注意** +#### keepRunningAfterReturn@keep-running + +> 新增于HBuilderX 3.5.1 + +阿里云、腾讯云nodejs8在云函数return之后其余逻辑会被冻结不再执行。腾讯云nodejs12表现恰好相反,云函数return之后还会等待其余逻辑执行后才会将此云函数实例空闲出来。 + +以下面的代码为例 + +```js +exports.main = async function(event, context) { + setTimeout(()=>{ + console.log('delay 5 second') + }, 5000) + return {} +} +``` + +如果此云函数运行在阿里云或腾讯云nodejs8,setTimeout里面的console.log不会在本次云函数调用执行,但是可能在云函数实例再次被复用时继续执行。 + +如果此云函数运行在腾讯云nodejs12,setTimeout里面的console.log会在本次云函数调用内,同样的本次云函数计费时间也会按照最终执行完成的时间计算(5000ms+return耗时)。但是前端无需等待5秒即可收到响应。**注意:如果有未断开的长连接(例如:redis连接)会导致云函数一直运行到配置的超时时间** + +当在云函数package.json内的cloudfunction-config内配置了`keepRunningAfterReturn: false`时,可以改变腾讯云nodejs12的表现,云函数return之后将不再继续执行,未断开的长连接也不会增加云函数实际运行时间,简单来说其表现和腾讯云nodejs8一致。 + +**腾讯云nodejs12使用redis** + +由于redis需要和服务器建立连接,此连接会阻止云函数结束执行。如果没有云函数return之后还需要继续执行的需求,可以简单的在`cloudfunction-config`内配置`keepRunningAfterReturn: false`。 + +如果需要return之后继续执行,那么需要在使用完毕后断开redis连接,调用`redis.quit()`方法即可断开连接。需要注意的是断开连接后之前建立的连接将不再可用,下个请求到来时需要使用`uniCloud.redis()`方法重新建立连接。 + +### 注意事项 - 插件作者在发布插件时,如果云函数有特殊设置,应该放入package.json中,然后发布到插件市场。这样就不用再通过说明文档一步一步引导用户去配置云函数定时触发器、内存、url化路径等 - 在web控制台修改云函数配置后,通过HBuilderX的下载云函数菜单会在package.json内添加修改后的云函数配置 diff --git a/docs/uniCloud/cloud-obj.md b/docs/uniCloud/cloud-obj.md index ddd810031b9fa7b3ab4ffe4e78eaf0d681af18d6..d10f6135ca280eb8e840691c7acd17429a64b827 100644 --- a/docs/uniCloud/cloud-obj.md +++ b/docs/uniCloud/cloud-obj.md @@ -236,7 +236,7 @@ module.exports = { // clientIP, // appId, // deviceId, - // ua, + // userAgent, // //... 其他getSystemInfoSync返回值 // } } @@ -245,9 +245,15 @@ module.exports = { **返回值** -getClientInfo返回的信息,是在客户端的[uni.getSystemInfo](https://uniapp.dcloud.net.cn/api/system/info.html#getsysteminfo)的基础之上,增加了`clientIP`,即客户端IP。 +getClientInfo返回的信息,是在客户端的[uni.getSystemInfo](https://uniapp.dcloud.net.cn/api/system/info.html#getsysteminfo)的基础之上,增加了一些额外的信息。 -除了`clientIP`,返回的其他字段请参考[uni.getSystemInfo](https://uniapp.dcloud.net.cn/api/system/info.html#getsysteminfo)。 +除了`getSystemInfo`返回字段外,还包含以下信息 + +|属性名 |类型 |说明 | +|-- |-- |-- | +|clientIP |string |客户端ip | +|source |string |调用来源,同:[云函数context.SOURCE](uniCloud/cf-function.md?id=context-source),新增于`HBuilderX 3.5.1` | +|scene |string |客户端[uni.getLaunchOptionsSync](/api/plugins/getLaunchOptionsSync.html#getlaunchoptionssync)返回的scene参数,新增于`HBuilderX 3.5.1` | **注意** @@ -267,7 +273,10 @@ module.exports = { const cloudInfo = this.getCloudInfo() // cloudInfo = { // provider, - // spaceId + // spaceId, + // version, + // functionName, + // functionType, // } } } @@ -275,10 +284,13 @@ module.exports = { **返回值** -|参数名 |类型 |必备 |说明 | -|-- |-- |-- |-- | -|provider |string |是 |服务空间供应商,阿里云为aliyun,腾讯云为tcb| -|spaceId |string |是 |服务空间Id | +|参数名 |类型 |必备 |说明 | +|-- |-- |-- |-- | +|provider |string |是 |服务空间供应商,阿里云为aliyun,腾讯云为tcb | +|spaceId |string |是 |服务空间Id | +|version |string |是 |服务端sdk版本,本地调试插件随HBuilderX更新,云端保持与最新HBuilderX一致,新增于`HBuilderX 3.5.1` | +|functionName |string |是 |云对象名称,新增于`HBuilderX 3.5.1` | +|functionType |string |是 |云对象此值固定为`cloudobject`,新增于`HBuilderX 3.5.1` | ### 获取客户端token@get-uni-id-token diff --git a/docs/uniCloud/known-issue.md b/docs/uniCloud/known-issue.md new file mode 100644 index 0000000000000000000000000000000000000000..e647f04d0ea630eec89acf6fb2a20bb46d801506 --- /dev/null +++ b/docs/uniCloud/known-issue.md @@ -0,0 +1,74 @@ +## 数据库@db + +### 日期对象@date-obj + +#### 腾讯云和阿里云云函数的差异 + +腾讯云和阿里云在日期处理方面的差异主要体现在对ISOString格式的日期字符串(例:`2022-07-01T02:50:11.142Z`)入库时。腾讯云在入库时不会进行特殊处理,会以字符串形式存储此字符串,阿里云会将此格式字符串转为日期对象存储。以下代码比较容易理解此问题 + +```js +// 云函数代码 +'use strict'; +const db = uniCloud.database() +function getType(val) { + return Object.prototype.toString.call(val).slice(8, -1).toLowerCase() +} +exports.main = async (event, context) => { + const addRes = await db.collection('date-test').add({ + dateStr: '2022-07-01T02:50:11.142Z', + dateObj: new Date() + }) + const getRes = await db.collection('date-test').doc(addRes.id).get() + const { + dateStr, + dateObj + } = getRes.data[0] + console.log(getType(dateStr)) // 腾讯云:string,阿里云:date + console.log(getType(dateObj)) // 腾讯云:date,阿里云:date + return {} +}; +``` + +#### 腾讯云和阿里云web控制台的差异 + +同为日期对象,在web控制台腾讯云和阿里云展示的格式并不一致。以上述代码中的dateObj字段为例 + +腾讯云会展示为如下格式: + +```js +{ + "dateObj": { + "$date":1656424298294 + } +} +``` + +阿里云会展示为如下格式: + +```js +{ + "dateObj": "2022-07-01T03:17:39.226Z" // 阿里云在web控制台展示为字符串,但实际底层存储的是日期对象 +} +``` + +#### clientDB + +clientDB在存储日期字符串及日期对象时和使用的云厂商表现一致。但是在取出日期对象时会得到ISOString格式的字符串 + +```js +// 客户端代码 +const db = uniCloud.database() +async function test() { + const getRes = await db.collection('date-test').get() + const dateObj = getRes.result.data[0].dateObj // "2022-07-01T03:17:39.226Z" +} + +test() +``` + + +## 云函数@cloudfunction + +### 异步行为@async-process + +阿里云、腾讯云nodejs8在云函数return之后其余逻辑会被冻结不再执行。腾讯云nodejs12表现恰好相反,云函数return之后还会等待其余逻辑执行后才会将此云函数实例空闲出来。详情见:[keepRunningAfterReturn](uniCloud/cf-functions.md?id=keep-running) \ No newline at end of file diff --git a/docs/uniCloud/redis.md b/docs/uniCloud/redis.md index 5b2967b46fd9cb1b30b58596dcdb7593b3ec2bf5..31875c70d6b0eaaa2150cff169cf7c9dd7624c33 100644 --- a/docs/uniCloud/redis.md +++ b/docs/uniCloud/redis.md @@ -791,6 +791,24 @@ const [operationType, currentValue] = await redis.eval(`local val = redis.call(' `, 0) ``` +### quit@quit + +断开redis连接,会等待redis请求执行完成后才断开连接 + +**接口形式** + +```js +await redis.quit() +``` + +**入参说明** + +无 + +**返回值** + +调用成功后返回`OK`字符串 + ## FAQ@faq - 云函数与redis的连接