diff --git a/docs/uniCloud/cf-functions.md b/docs/uniCloud/cf-functions.md index 53ae90037d7e9d05a0920158900c67761ffa31c2..365576ffcad9e3a04710d9118f527076239f9c13 100644 --- a/docs/uniCloud/cf-functions.md +++ b/docs/uniCloud/cf-functions.md @@ -16,13 +16,13 @@ 云函数的é…置文件和 npm规范 相åŒï¼Œåœ¨äº‘函数目录下å¯æ–°å»ºä¸€ä¸ª package.json æ¥å˜æ”¾é…置。uniCloud云函数扩展了 package.jsonï¼Œå¢žåŠ äº†ä¸€äº›ç‰¹æœ‰çš„é…置项。[详è§](/uniCloud/cf-functions?id=packagejson) -云函数å¯åŠ¨åŽçŽ¯å¢ƒä¼šä¿ç•™ä¸€æ®µæ—¶é—´ï¼ˆå¦‚15分钟),超过ä¿ç•™æœŸåŽè‹¥è¯¥äº‘函数一直没有被å†è°ƒç”¨ï¼Œé‚£è¿™ä¸ªçŽ¯å¢ƒä¼šè¢«é‡Šæ”¾ã€‚所以云函数有冷å¯åŠ¨çš„概念。ä¸è¿‡ç”±äºŽjs环境的å¯åŠ¨è¦æ¯”phpå’Œjava更快,所以js适åˆserverlessæ–¹å¼ã€‚ +云函数å¯åŠ¨åŽå®žä¾‹ä¼šä¿ç•™ä¸€æ®µæ—¶é—´ï¼ˆå¦‚15分钟),超过ä¿ç•™æœŸåŽè‹¥è¯¥äº‘函数一直没有被å†è°ƒç”¨ï¼Œé‚£è¿™ä¸ªå®žä¾‹ä¼šè¢«é‡Šæ”¾ã€‚所以云函数有冷å¯åŠ¨çš„概念。ä¸è¿‡ç”±äºŽjs实例的å¯åŠ¨è¦æ¯”phpå’Œjava更快,所以js更适åˆserverlessæ–¹å¼ã€‚ **注æ„事项** - 云函数内使用commonjs规范,ä¸å¯ä½¿ç”¨importã€export,å‚考:[commonjs模å—](http://nodejs.cn/api/modules.html#modules_modules_commonjs_modules) - ä¸åŒé¡¹ç›®ä½¿ç”¨åŒä¸€ä¸ªæœåŠ¡ç©ºé—´æ—¶ï¼Œä¸å¯ä½¿ç”¨åŒå云函数。åŒå云函数会相互覆盖。 - 在HBuilderX创建云函数时,如果新云函数与æœåŠ¡å™¨ä¸Šå·²å˜åœ¨åŒå云函数,会用新函数覆盖。所以应先选择从æœåŠ¡ç©ºé—´ä¸‹è½½äº‘函数。 -- å•ä¸ªäº‘函数大å°é™åˆ¶ä¸º10M(包å«node_modules),过大的云函数影å“è¿è¡Œæ€§èƒ½ï¼Œä¹Ÿä¼šå¢žåŠ 计费的gbs。 +- å•ä¸ªäº‘函数大å°é™åˆ¶ä¸º10M(包å«`node_modules`),过大的云函数影å“è¿è¡Œæ€§èƒ½ï¼Œä¹Ÿä¼šå¢žåŠ 计费的gbs。åŒæ—¶è…¾è®¯äº‘支æŒåœ¨äº‘端安装`node_modules`,æ¤æ—¶ä¸å 用云函数体积。 - uniCloud的阿里云版,暂ä¸å¯ä½¿ç”¨ç›¸å¯¹è·¯å¾„读å–文件(比如`fs.readFileSync('./info.txt')`),å¯ä»¥ä½¿ç”¨ç»å¯¹è·¯å¾„`fs.readFileSync(path.resolve(__dirname,'./info.txt'))` ## 云函数的分类 @@ -33,7 +33,7 @@ - 云对象:是通过å‰ç«¯å¯¼å…¥å¯¹è±¡æ¥æ“作的,客户端使用`uniCloud.importObject("")`导入云对象。详è§[云对象](/uniCloud/cloud-obj) - 公共模å—:用于ä¸åŒçš„云函数/云对象,抽å–和共享相åŒä»£ç ,详è§[公共模å—文档](/uniCloud/cf-functions?id=公共模å—) - action云函数:为了弥补clientDB客户端直接æ“作数æ®åº“çš„å±€é™è€Œè®¾è®¡çš„,详è§[clientDB action文档](/uniCloud/clientdb?id=action) -- uniCloud扩展库:为了è£å‰ªå’ŒæŽ§åˆ¶äº‘函数体积而设计的,一些ä¸å¤ªå¸¸ç”¨çš„功能比如Redis,独立为扩展库,é¿å…增大æ¯ä¸ªäº‘函数的体积,详è§[uniCloud扩展库](/uniCloud/cf-functions?id=扩展库) +- uniCloud扩展库:为了è£å‰ªå’ŒæŽ§åˆ¶äº‘函数体积而设计的,一些ä¸å¤ªå¸¸ç”¨çš„功能比如Redis,独立为å¯é€‰æ‰©å±•åº“,é¿å…增大æ¯ä¸ªäº‘函数的体积,详è§[uniCloud扩展库](/uniCloud/cf-functions?id=扩展库) HBuilderXä¸uniCloud项目的云函数å‡åœ¨é¡¹ç›®çš„`uniCloud/cloudfunctions`目录下,目录结构如下: @@ -74,19 +74,6 @@ uniCloud体系里,客户端和æœåŠ¡ç«¯çš„云函数通信,有4ç§æ–¹å¼ï¼š ### clientDBæ–¹å¼ -- clientDB适用的情况: - -如果客户端使用uni-appå¼€å‘,且å‘uniCloudæœåŠ¡ç©ºé—´çš„请求主è¦æ˜¯ä¸ºäº†æ“作云数æ®åº“ï¼ˆæ— è®ºå¢žåˆ æ”¹æŸ¥ï¼‰ï¼Œé‚£ä¹ˆæŽ¨è使用clientDBæ–¹å¼ï¼Œç”±uni-app客户端直接æ“作云数æ®åº“。 - -如果æ“作数æ®åº“çš„åŒæ—¶ï¼Œè¿˜éœ€è¦åŒæ—¶æ‰§è¡Œä¸€äº›äº‘函数,å¯ä»¥ä½¿ç”¨clientDBçš„action云函数。 - -- clientDBä¸é€‚用的情况: - -1. 请求ä¸æ“作云数æ®åº“,比如å‘外部web系统å‘请求ã€æ“作redisã€åˆ 除云文件ç‰ï¼› -2. æ“作的云数æ®åº“请求ä¸å¸Œæœ›æš´éœ²åœ¨å‰ç«¯ï¼› -3. æ•°æ®åº“表和å—段数é‡å¤šè€ŒæŽ¥å£æ•°é‡å°‘。给æ¯ä¸ªæ•°æ®é…ç½®æƒé™çš„工作é‡è¶…过了控制少数接å£æƒé™çš„工作é‡ï¼› -4. æƒé™ä½“系较å¤æ‚,除了用户和管ç†å‘˜å¤–还有较多其他æƒé™æ¡ä»¶æˆ–动æ€æƒé™ã€‚æ¤æ—¶åœ¨schemaå’Œactionä¸ç¼–写代ç çš„å¤æ‚度超过了写接å£ã€‚ - **直观体验代ç 示例** clientDB分APIæ–¹å¼å’Œç»„件方å¼ï¼Œæ¤å¤„使用APIæ–¹å¼æ¥æ¼”示 @@ -103,6 +90,19 @@ db.collection('list').get() 由于篇幅较长,å¦ä¹ clientDB需å¦è§æ–‡æ¡£[clientDB](clientdb.md) +- clientDB适用的情况: + +如果客户端使用uni-appå¼€å‘,且å‘uniCloudæœåŠ¡ç©ºé—´çš„请求主è¦æ˜¯ä¸ºäº†æ“作云数æ®åº“ï¼ˆæ— è®ºå¢žåˆ æ”¹æŸ¥ï¼‰ï¼Œé‚£ä¹ˆæŽ¨è使用clientDBæ–¹å¼ï¼Œç”±uni-app客户端直接æ“作云数æ®åº“。 + +如果æ“作数æ®åº“çš„åŒæ—¶ï¼Œè¿˜éœ€è¦åŒæ—¶æ‰§è¡Œä¸€äº›äº‘函数,å¯ä»¥ä½¿ç”¨clientDBçš„action云函数。 + +- clientDBä¸é€‚用的情况: + +1. 请求ä¸æ“作云数æ®åº“,比如å‘外部web系统å‘请求ã€æ“作redisã€åˆ 除云文件ç‰ï¼› +2. æ“作的云数æ®åº“请求ä¸å¸Œæœ›æš´éœ²åœ¨å‰ç«¯ï¼› +3. æ•°æ®åº“表和å—段数é‡å¤šè€ŒæŽ¥å£æ•°é‡å°‘。给æ¯ä¸ªæ•°æ®é…ç½®æƒé™çš„工作é‡è¶…过了控制少数接å£æƒé™çš„工作é‡ï¼› +4. æƒé™ä½“系较å¤æ‚,除了用户和管ç†å‘˜å¤–还有较多其他æƒé™æ¡ä»¶æˆ–动æ€æƒé™ã€‚æ¤æ—¶åœ¨schemaå’Œactionä¸ç¼–写代ç çš„å¤æ‚度超过了写接å£ã€‚ + ### äº‘å¯¹è±¡æ–¹å¼ äº‘å¯¹è±¡å’ŒclientDB最大的区别,是云对象把数æ®åº“æ“作(以åŠå…¶ä»–逻辑)å°è£…在云对象的方法里é¢ã€‚ @@ -180,21 +180,7 @@ exports.main = async (event, context) => { ``` 由于篇幅较长,需å¦è§æ–‡æ¡£[云函数callfunctionæ–¹å¼](/uniCloud/cf-callfunction) -<!-- -å› æ–‡æ¡£åœ°å€è¿ç§»ï¼Œä¸ºé˜²æ¢è€é“¾æŽ¥å¤±æ•ˆï¼Œå¤‡ä»½å¦‚下: -#### 获å–用户token@client-token -文档已è¿ç§»è‡³ï¼š[普通云函数callFunction](/uniCloud/cf-callfunction.md?id=client-token) -#### 获å–客户端IP@clientip -文档已è¿ç§»è‡³ï¼š[普通云函数callFunction](/uniCloud/cf-callfunction.md?id=clientip) -#### 获å–客户端user-agent@client-user-agent -文档已è¿ç§»è‡³ï¼š[普通云函数callFunction](/uniCloud/cf-callfunction.md?id=client-user-agent) -#### 获å–æœåŠ¡ç©ºé—´ä¿¡æ¯@context-space-info -文档已è¿ç§»è‡³ï¼š[普通云函数callFunction](/uniCloud/cf-callfunction.md?id=context-space-info) -#### 获å–云函数调用æ¥æº@context-source -文档已è¿ç§»è‡³ï¼š[普通云函数callFunction](/uniCloud/cf-callfunction.md?id=context-source) -#### 其他客户端信æ¯@client-info -文档已è¿ç§»è‡³ï¼š[普通云函数callFunction](/uniCloud/cf-callfunction.md?id=client-info) - --> + ### 云函数URLåŒ–æ–¹å¼ å¯ä»¥è®©äº‘函数/云对象生æˆä¸€ä¸ªHTTP URLã€‚è¿™æ ·éžuni-app应用,å¯ä»¥é€šè¿‡ajax请求和云函数/云对象通信。 @@ -222,9 +208,9 @@ uniCloudæœåŠ¡å™¨ç»™å®¢æˆ·ç«¯è¿”回的数æ®æ ¼å¼ä¸€èˆ¬æ˜¯json,但jsonçš„æ ¼ 为了与uni-appå‰ç«¯çš„APIé”™è¯¯å›žè°ƒé£Žæ ¼ç»Ÿä¸€ï¼ŒuniCloudå“应体规范定义的云端返回信æ¯ï¼ˆå°¤å…¶æ˜¯æŠ¥é”™æ—¶ï¼‰åº”包å«`errCode`å’Œ`errMsg`。 -除æ¤ä¹‹å¤–å“应体规范还包å«`newToken`å—段,用于token的自动ç»æœŸï¼ˆäº‘对象接收å«æœ‰newTokençš„å“应åŽä¼šè‡ªåŠ¨æ›´æ–°storage内å˜å‚¨çš„uni_id_tokenåŠuni_id_token_expired,æ¤è¡Œä¸ºæ–°å¢žäºŽ`HBuilderX 3.4.13`)。开å‘è€…ä¸€èˆ¬æ— éœ€å…³å¿ƒæ¤æ•°æ®ï¼Œuni-app客户端和云端uni-id之间会自动管ç†tokenåŠç»æœŸã€‚ +除æ¤ä¹‹å¤–å“应体规范还包å«`newToken`å—段,用于token的自动ç»æœŸï¼ˆäº‘对象接收å«æœ‰newTokençš„å“应åŽä¼šè‡ªåŠ¨æ›´æ–°storage内å˜å‚¨çš„`uni_id_token`åŠ`uni_id_token_expired`,æ¤è¡Œä¸ºæ–°å¢žäºŽ`HBuilderX 3.4.13`)。开å‘è€…ä¸€èˆ¬æ— éœ€å…³å¿ƒæ¤æ•°æ®ï¼Œuni-app客户端和云端uni-id之间会自动管ç†tokenåŠç»æœŸã€‚ -示例如下: +`uniCloudå“应体`示例如下: ```json // 失败返回值 @@ -289,14 +275,14 @@ errMsg用于å˜æ”¾å…·ä½“错误信æ¯ï¼ŒåŒ…括展示给开å‘者ã€ç»ˆç«¯ç”¨æˆ· |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.logger |云函数ä¸æ‰“å°æ—¥å¿—到[uniCloud web控制å°](https://unicloud.dcloud.net.cn/)的日志系统(éžHBuilderX控制å°ï¼‰[详情](rundebug.md?id=uniCloudlogger) | -|uniCloud.httpProxyForEip |使用云厂商代ç†è®¿é—®httpæœåŠ¡ï¼ˆé˜¿é‡Œäº‘固定IPæ–¹æ¡ˆï¼‰ï¼Œä»…é˜¿é‡Œäº‘äº‘ç«¯çŽ¯å¢ƒæ”¯æŒ [详è§](#aliyun-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`| +|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 @@ -431,25 +417,39 @@ exports.main = async (event, context) => { ``` -## 其他API +## 请求和环境API -### 获å–请求id列表@get-request-list +由于å˜åœ¨[å•å®žä¾‹å¤šå¹¶å‘](#concurrency)的情况,实例级的uniCloud对象,和æ¯ä¸ªè¯·æ±‚request是一对多的关系。 + +è¿™ä¹Ÿé€ æˆäº†ä¸Žè¯·æ±‚相关的上下文,比如客户端信æ¯ï¼Œéœ€è¦é€šè¿‡è¯·æ±‚æ¥èŽ·å–。 -éžå•å®žä¾‹å¤šå¹¶å‘场景下列表长度为1,仅有的一个requestId表示当å‰è¯·æ±‚çš„requestId。å•å®žä¾‹å¤šå¹¶å‘场景下会返回æ£åœ¨å¤„ç†çš„所有请求的requestId列表。如需获å–当å‰è¯·æ±‚çš„requestIdå‚考:[云函数context](cf-callfunction.md#context)ã€[云对象获å–当å‰è¯·æ±‚çš„requestId](cloud-obj.md#get-request-id) +为了更好的管ç†è¯·æ±‚和请求相关的上下文,uniCloudæ供了下é¢ä¸€æ‰¹API。 + +### 获å–请求id列表@get-request-list **示例** ```js -uniCloud.getRequestList() // ['3228166e-3c17-4d58-9707-xxxxxxxx'] +uniCloud.getRequestList() +// 返回值:['3228166e-3c17-4d58-9707-xxxxxxxx'] ``` +如没有é…ç½®[å•å®žä¾‹å¤šå¹¶å‘](#concurrency),数组里åªä¼šè¿”回一项内容。é…ç½®åŽå¯èƒ½ä¼šå¤šé¡¹ï¼Œæ£åœ¨å¹¶å‘的所有请求的requestId都会返回。 + +当返回多项时,在uniCloudå¯¹è±¡ä¸Šæ— æ³•æ˜Žç¡®å½“å‰è¯·æ±‚是数组ä¸çš„哪一个。所以æ供了其他方法æ¥èŽ·å–当å‰è¯·æ±‚: +- 云对象通过`this.getUniCloudRequestId()`。[详情](cloud-obj.md#get-request-id) +- 云函数通过函数自带å‚æ•°context。[详情](cf-callfunction.md#context) ### 获å–客户端信æ¯åˆ—表#get-client-infos -éžå•å®žä¾‹å¤šå¹¶å‘场景下列表长度为1,仅有的一个cloudInfo表示当å‰è¯·æ±‚的客户端信æ¯ã€‚å•å®žä¾‹å¤šå¹¶å‘场景下返回æ£åœ¨å¤„ç†çš„所有请求的客户端信æ¯åˆ—表。 +åŒç†ï¼Œè€ƒè™‘到å•å®žä¾‹å¤šå¹¶å‘,`uniCloud.getClientInfos()`获å–客户端信æ¯ä¹Ÿæ˜¯ä¸€ä¸ªæ•°ç»„。 ```js const clientInfos = uniCloud.getClientInfos() +``` + +返回值 +```js clientInfos = [{ appId: '__UNI_xxxxx', requestId: '3228166e-3c17-4d58-9707-xxxxxxxx' @@ -457,6 +457,8 @@ clientInfos = [{ }] ``` +如未开å¯å•å®žä¾‹å¤šå¹¶å‘,那么数组åªæœ‰1项。å•å®žä¾‹å¤šå¹¶å‘场景下返回æ£åœ¨å¹¶å‘的所有请求的客户端信æ¯åˆ—表。 + **返回值** getClientInfos返回的信æ¯ï¼Œæ˜¯åœ¨å®¢æˆ·ç«¯çš„[uni.getSystemInfo](/api/system/info.md#getsysteminfo)çš„åŸºç¡€ä¹‹ä¸Šï¼Œå¢žåŠ äº†ä¸€äº›é¢å¤–çš„ä¿¡æ¯ã€‚ @@ -465,13 +467,13 @@ getClientInfos返回的信æ¯ï¼Œæ˜¯åœ¨å®¢æˆ·ç«¯çš„[uni.getSystemInfo](/api/syste |属性å |类型 |说明 | |-- |-- |-- | +|requestId|string |请求Id,å¯ä»¥ä½¿ç”¨æ¤å—段ç›é€‰å‡ºå½“å‰è¯·æ±‚çš„å®¢æˆ·ç«¯ä¿¡æ¯ | |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,å¯ä»¥ä½¿ç”¨æ¤å—段ç›é€‰å‡ºå½“å‰è¯·æ±‚çš„å®¢æˆ·ç«¯ä¿¡æ¯ | -云函数调用æ¥æºï¼Œå®ƒçš„值域为: +云函数调用æ¥æºsource,它的值域为: |å–值 |说明 | |-- |-- | @@ -486,9 +488,13 @@ getClientInfos返回的信æ¯ï¼Œæ˜¯åœ¨å®¢æˆ·ç«¯çš„[uni.getSystemInfo](/api/syste - 除了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) +除了`uniCloud.getClientInfos()`API,在云函数context和云对象thisä¸ï¼Œä¹Ÿå¯ä»¥ç›´æŽ¥èŽ·å–当å‰å®¢æˆ·ç«¯ä¿¡æ¯ã€‚ +- 云对象通过`this.getClientInfo()`。[详情](cloud-obj.md#get-client-info) +- 云函数通过函数自带å‚æ•°context。[详情](cf-callfunction.md#context) + ### 获å–云端信æ¯@get-cloud-infos -éžå•å®žä¾‹å¤šå¹¶å‘场景下列表长度为1,仅有的一个cloudInfo表示当å‰è¯·æ±‚的云端信æ¯ã€‚å•å®žä¾‹å¤šå¹¶å‘场景下返回æ£åœ¨å¤„ç†çš„所有请求的云端信æ¯åˆ—表。 +åŒä¸Šï¼Œä¸ºäº†å…¼å®¹å¹¶å‘场景,获å–云端信æ¯`uniCloud.getCloudInfos()`返回的也是数组。 **示例** @@ -505,13 +511,25 @@ cloudInfos = [{ **返回值** -|å‚æ•°å |类型 |必备 |说明 | -|-- |-- |-- |-- | -|provider |string |是 |æœåŠ¡ç©ºé—´ä¾›åº”商,阿里云为:`aliyun`,腾讯云为:`tencent`| -|spaceId |string |是 |æœåŠ¡ç©ºé—´Id | -|functionName |string |是 |云对象å称,新增于 | -|functionType |string |是 |云对象æ¤å€¼å›ºå®šä¸º`cloudobject`,新增于 | -|requestId |string |是 |请求Id,å¯ä»¥ä½¿ç”¨æ¤å—段ç›é€‰å‡ºå½“å‰è¯·æ±‚çš„äº‘ç«¯ä¿¡æ¯ | +|å‚æ•°å |类型 |必备 |说明 | +|-- |-- |-- |-- | +|provider |string |是 |æœåŠ¡ç©ºé—´ä¾›åº”商,阿里云为:`aliyun`,腾讯云为:`tencent`| +|spaceId |string |是 |æœåŠ¡ç©ºé—´Id | +|functionName |string |是 |云函数å称 | +|functionType |string |是 |云对象为`cloudobject`ã€äº‘对象为`cloudfunction` | +|requestId |string |是 |请求Id,å¯ä»¥ä½¿ç”¨æ¤å—段ç›é€‰å‡ºå½“å‰è¯·æ±‚çš„äº‘ç«¯ä¿¡æ¯ | + +除了`uniCloud.getCloudInfos()`API,在云函数context和云对象thisä¸ï¼Œä¹Ÿå¯ä»¥ç›´æŽ¥èŽ·å–当å‰è¯·æ±‚的云端信æ¯ã€‚ +- 云对象通过`this.getCloudInfo()`。[详情](cloud-obj.md#get-cloud-info) +- 云函数通过函数自带å‚æ•°context。[详情](cf-callfunction.md#context) + + +上述3个APIï¼Œéƒ½å› ä¸ºå•å®žä¾‹å¤šå¹¶å‘而被设计æˆæ•°ç»„æ–¹å¼ã€‚实际上,大多数开å‘者并ä¸ä½¿ç”¨å•å®žä¾‹å¤šå¹¶å‘。 + +在ä¸è€ƒè™‘å•å®žä¾‹å¤šå¹¶å‘时,也å¯ä»¥ç›´æŽ¥ä½¿ç”¨uniCloudçš„getRequestListã€getClientInfosã€getCloudInfos方法ä¸ç¬¬ä¸€ä¸ªæ•°ç»„项。 + +或者在云对象的this和云函数的context里获å–相关上下文信æ¯ä¹Ÿå¯ä»¥ã€‚ + ## 扩展库@extension @@ -710,35 +728,9 @@ myCloud.uploadFile() - 连接本地云函数调试时,如果å˜åœ¨è·¨æœåŠ¡ç©ºé—´è°ƒç”¨ï¼Œåˆ™callFunction会使用云端云函数 -## 云函数è¿è¡ŒçŽ¯å¢ƒè¯´æ˜Ž@runtime +## serverless环境说明@runtime -云函数è¿è¡Œåœ¨ node 环境ä¸ã€‚å¯ä»¥ä½¿ç”¨ node api `process.version` èŽ·å– node 版本。 - -- uniCloud 阿里云默认是 node8.17.0,也å¯ä»¥åœ¨ package.json ä¸é€‰æ‹© node12 -- uniCloud 腾讯云默认是 node8.9.4,也å¯ä»¥åœ¨ package.json ä¸é€‰æ‹© node12 -- HBuilderX 本地è¿è¡ŒçŽ¯å¢ƒä½¿ç”¨çš„是 HBuilderX 自带的 node 版本,目å‰ä¸º node12。在 package.json 选择 node版本 åªäº‘端生效,且åªåœ¨ç¬¬ä¸€æ¬¡ä¸Šä¼ 云函数时生效。 - -**注æ„** -- 本地开å‘一旦使用了 node12 的专用 apiï¼Œä¸Šä¼ äº‘å‡½æ•°æ—¶å¿…é¡»åœ¨package.json里手动é…置选择 node12 çš„è¿è¡ŒçŽ¯å¢ƒã€‚ - 之所以没有在云端默认统一使用 node12ï¼Œæ˜¯å› ä¸ºè…¾è®¯äº‘ node12 çš„ return ç–略有一些特殊情况,[è§ä¸‹](?id=return)。 -- è¿è¡ŒçŽ¯å¢ƒåœ¨äº‘端云函数创建时设定,ä¸å¯é€šè¿‡æ›´æ–°äº‘函数æ¥ä¿®æ”¹ã€‚ - ä¹Ÿå°±æ˜¯ç¬¬ä¸€æ¬¡ä¸Šä¼ äº‘å‡½æ•°çš„æ—¶å€™ï¼Œpackage.json里é…了什么,就是什么。如果需è¦ä¿®æ”¹ï¼Œéœ€å…ˆåˆ 除云端云函数,é‡æ–°ä¸Šä¼ 。 - -node版本å¯ä»¥åœ¨äº‘函数的package.json文件的`cloudfunction-config->runtime`å—段进行é…置,详情å‚考:[云函数package.json](uniCloud/cf-functions.md?id=packagejson) - -### 云函数实例åŠéƒ¨åˆ†å˜é‡è¯´æ˜Ž@instance - -所谓实例是指云函数的一个执行环境,å¯ä»¥ç®€å•çš„ç†è§£ä¸ºä¸€ä¸ªnode进程。客户端å‘起的请求都会由一个个的云函数实例进行处ç†ã€‚ - -**全局å˜é‡è¯´æ˜Ž** - -在一个实例内uniCloudåªä¼šè¿›è¡Œä¸€æ¬¡åˆå§‹åŒ–ï¼Œå› æ¤ä¸€ä¸ªå®žä¾‹ä¹Ÿåªæœ‰ä¸€ä¸ªuniCloud全局对象。 - -**局部å˜é‡è¯´æ˜Ž** - -云函数入å£å…¥å‚包å«ä¸€ä¸ªevent和一个context,这两个å‚数和请求相关,æ¯æ¬¡æœ‰æ–°è¯·æ±‚到云函数实例时就会有一个新的event对象和一个新的context对象 - -云对象的thiså’Œeventã€context类似,æ¯ä¸ªè¯·æ±‚都对应一个å•ç‹¬çš„this。 +serverless是动æ€åˆ†åˆ«è®¡ç®—资æºçš„,由æ¤ä¼šå¼•å‘的出一批特有概念:冷å¯åŠ¨ã€å®žä¾‹ã€å¹¶å‘请求ã€æ— 状æ€ã€ä¼ªå…¨å±€å˜é‡ã€‚ ### 云函数冷å¯åŠ¨ã€çƒå¯åŠ¨@launchtype @@ -749,11 +741,14 @@ node版本å¯ä»¥åœ¨äº‘函数的package.json文件的`cloudfunction-config->runti 1. severless实例化计算实例 2. åŠ è½½å‡½æ•°ä»£ç 3. å¯åŠ¨ node -4. 执行代ç +4. 执行云函数代ç -函数被调用时,执行这些完整æ¥éª¤çš„过程一般称作`冷å¯åŠ¨`, 冷å¯åŠ¨çš„耗时长于çƒå¯åŠ¨ï¼Œä¸€èˆ¬åœ¨ä¸€ç§’出头。 +函数被调用时,执行这些完整æ¥éª¤çš„过程称作`冷å¯åŠ¨`, 冷å¯åŠ¨çš„耗时一般在一秒左å³ã€‚ -而如果函数实例和执行进程都被å¤ç”¨çš„情况下一般被定义为`çƒå¯åŠ¨`, çƒå¯åŠ¨æ²¡æœ‰æ€§èƒ½é—®é¢˜ã€‚ +一个云函数实例冷å¯åŠ¨åŽï¼Œserverless调度ä¸å¿ƒä¼šä¿ç•™è¿™ä¸ªå®žä¾‹ä¸€å®šæ—¶é—´ã€‚在实例ä¿ç•™æœŸé—´ï¼Œå®¢æˆ·ç«¯å†æ¬¡è¯·æ±‚云函数,ä¸ä¼šè§¦å‘冷å¯åŠ¨ï¼Œé€Ÿåº¦ä¼šæ›´å¿«ã€‚实例的详细定义[è§ä¸‹](#instance) + +云函数实例和执行进程都被å¤ç”¨çš„情况下称之为`çƒå¯åŠ¨`, çƒå¯åŠ¨æ€§èƒ½è¦å¥½éžå¸¸å¤šï¼Œå› 为它åªæœ‰ä¸€ä¸ªæ¥éª¤ï¼š +1. 执行云函数代ç 如果一个云函数实例长时间没有被å†æ¬¡è°ƒç”¨ï¼Œåˆ™è¯¥è®¡ç®—实例会被**回收**ï¼›åŽç»å†æ¬¡è°ƒç”¨è¯¥äº‘函数时,就会å†æ¬¡è§¦å‘云函数的**冷å¯åŠ¨**。 @@ -773,34 +768,205 @@ node版本å¯ä»¥åœ¨äº‘函数的package.json文件的`cloudfunction-config->runti 4. 阿里云支æŒé…置云函数的å•å®žä¾‹å¤šå¹¶å‘,请å‚考:[å•å®žä¾‹å¤šå¹¶å‘](cf-functions.md?id=concurrency) 5. 腾讯云付费进行实例预留 -### äº‘å‡½æ•°çš„æ— çŠ¶æ€@state-less +### 实例与请求@instance + +`实例`,指云函数的一个执行环境,å¯ä»¥ç®€å•çš„ç†è§£ä¸ºä¸€ä¸ªnode进程。 + +æ¯æ¬¡å®¢æˆ·ç«¯å‘èµ·`请求`(request)时,serverless的调度ä¸å¿ƒä¼šæŸ¥çœ‹å·²å¯åŠ¨ã€ä¸”空闲的实例,分é…一个实例æ¥æŽ¥æ”¶è¿™ä¸ªè¯·æ±‚。如果没有空闲实例,则新起一个实例。 + +新起一个实例需è¦ä¸€å®šæ—¶é—´ï¼Œä¹Ÿå³ä¸Šæ–‡è¯´çš„冷å¯åŠ¨é—®é¢˜ã€‚详è§[冷å¯åŠ¨](#launchtype) -å› ä¸ºå˜åœ¨å†·çƒå¯åŠ¨çš„差异,云函数ä¸çš„全局å˜é‡å°±å¯èƒ½å‡ºçŽ°æ¯æ¬¡ä¸ä¸€æ ·çš„情况。也就是**äº‘å‡½æ•°æ˜¯æ— çŠ¶æ€çš„**。 +一个实例å¯åŠ¨åŽï¼Œä¸€èˆ¬åœ¨1秒内就会完æˆè¯·æ±‚,但serverless调度ä¸å¿ƒä¼šä¿ç•™è¿™ä¸ªå®žä¾‹ä¸€å®šæ—¶é—´ï¼ˆæ—¶é—´è§ä¸Šä¸€èŠ‚)。在实例ä¿ç•™æœŸé—´ï¼Œå®¢æˆ·ç«¯å†æ¬¡è¯·æ±‚云函数,ä¸ä¼šè§¦å‘冷å¯åŠ¨ã€‚ -以如下代ç 为例,`count`作为全局å˜é‡ï¼Œå½“多次调用该云函数时,å¯èƒ½ä¼šå‡ºçŽ°å˜é‡ç´¯åŠ 的情况(实例未å¤ç”¨æ—¶ï¼Œæ¯æ¬¡è¿”回0,若实例被å¤ç”¨ï¼Œåˆ™å¯èƒ½è¿”回1ã€2ã€3ç‰å„ç§æ„外情况)。所以ä¸è¦è¿™ä¹ˆä½¿ç”¨ã€‚ +也就是说,**在实例ä¿ç•™æœŸé—´ï¼Œ1个实例会接å—多个客户端请求。** +所以è¦æ³¨æ„`实例`å’Œ`请求`ä¸æ˜¯ä¸€å¯¹ä¸€å…³ç³»ã€‚ + +`请求`(request),指一次连接云函数的网络请求。ä¸åŒè¯·æ±‚有ä¸åŒçš„上下文信æ¯ï¼ˆæ¯”如客户端UA)。 + +所以想è¦èŽ·å–客户端信æ¯ï¼Œä¸€å®šæ³¨æ„ä¸æ˜¯åœ¨å®žä¾‹çš„全局对象上获å–,而是需è¦åœ¨è¯·æ±‚的上下文ä¸èŽ·å–。[详è§]() + +在uniCloud阿里云版,阿里云还æ供了1个实例的多并å‘请求é…置,å³åŒä¸€æ—¶é—´å¤šä¸ªè¯·æ±‚å¯ä»¥å¹¶å‘执行。 +也就是åŒä¸€æ—¶é—´çš„请求å‘到云函数时,没有é…ç½®å•å®žä¾‹å¤šå¹¶å‘会新开一个云函数实例,é…置了å•å®žä¾‹å¤šå¹¶å‘则ä¸ä¼šæ–°å¼€å®žä¾‹ï¼Œåœ¨ä¸€ä¸ªå®žä¾‹ä¸å¢žåŠ 并å‘。 +详è§[å•å®žä¾‹å¤šå¹¶å‘](#concurrency)。 + +一个云函数,å¯ä»¥åŒæ—¶å˜åœ¨å¤šä¸ªå®žä¾‹ã€‚比如cf1云函数,如未é…ç½®å•å®žä¾‹å¤šå¹¶å‘,10个请求åŒæ—¶è¾¾åˆ°äº‘函数,就会开10个实例。 + +ä¸ç®¡å¼€äº†å¤šå°‘实例,云函数的计费是按请求计费的。实例å“应请求åŽåˆ°ä¿ç•™æœŸç»“æŸä¹‹é—´ï¼Œå¦‚æžœä¸å‘生新请求是ä¸ä¼šè®¡è´¹çš„。 + +### äº‘å‡½æ•°çš„æ— çŠ¶æ€å’Œå…¨å±€å˜é‡@state-less + +å› ä¸ºå®žä¾‹å¯èƒ½ç¬¬ä¸€æ¬¡å¯åŠ¨ï¼Œä¹Ÿå¯èƒ½å·²ç»å¯åŠ¨ï¼Œæ‰€ä»¥äº‘函数ä¸çš„js全局å˜é‡å…¶å®žæ˜¯ä¼ªå…¨å±€å˜é‡ã€‚也就是**äº‘å‡½æ•°æ˜¯æ— çŠ¶æ€çš„**。 + +在云函数ä¸ï¼Œå†™åœ¨`module.exports = {}`之å‰ï¼Œäº‘函数写在`exports.main = async (event, context) => {}`之å‰çš„å˜é‡å®šä¹‰ï¼Œæ˜¯ä¼ªå…¨å±€å˜é‡ã€‚ + +它们在实例有效期内的多次请求ä¸ä¼šå¤ç”¨ã€‚ + +以如下代ç 为例,`count`作为全局å˜é‡ï¼Œå½“多次调用该云函数时,å¯èƒ½ä¼šå‡ºçŽ°å˜é‡ç´¯åŠ 的情况。 + +- 云对象示例 +```js +let count = 0; +module.exports = { + methoda() { + return count++ + } +} +``` + +- 云函数示例 ```javascript let count = 0; -module.exports = async (event) => { - return count++ - //æ¤ç¤ºä¾‹ä¸ºé”™è¯¯ç¤ºä¾‹ - //云函数实例未å¤ç”¨æ—¶ï¼Œæ¯æ¬¡è¿”回0 - //若实例被å¤ç”¨ï¼Œåˆ™å¯èƒ½è¿”回1ã€2ã€3ç‰å„ç§æ„外情况 +exports.main = async (event, context) => { + return count++ } ``` -**require由于å˜åœ¨ç¼“å˜ï¼Œä¹Ÿå˜åœ¨åŒæ ·çš„问题。尽é‡ä¸è¦ç›´æŽ¥ä¿®æ”¹require返回的内容** +上é¢2个示例ä¸ï¼Œå®žä¾‹æœªå¤ç”¨æ—¶ï¼Œä¹Ÿå°±æ˜¯å†·å¯åŠ¨æ—¶ï¼Œcount的值æ¯æ¬¡éƒ½æ˜¯0;若实例被å¤ç”¨ï¼Œåˆ™å¯èƒ½è¿”回1ã€2ã€3ç‰å„ç§æ„外情况。 + +当然,å¯ä»¥ç”¨è¿™ä¸ªæ–¹æ³•æ¥èŽ·çŸ¥ä¸€ä¸ªå®žä¾‹è¢«é‡ç”¨äº†å¤šå°‘次请求。 + +**require由于å˜åœ¨ç¼“å˜ï¼Œä¹Ÿå˜åœ¨åŒæ ·çš„问题。尽é‡ä¸è¦ç›´æŽ¥ä¿®æ”¹require返回的内容。** -è™½ç„¶äº‘å‡½æ•°æ— çŠ¶æ€ï¼Œä½†æˆ‘们也å¯ä»¥é€šè¿‡å…¶ä»–æ–¹å¼æ¥æ›¿ä»£å…¨å±€å˜é‡ï¼š +**uniCloud全局对象也是跨请求的,与请求相关的内容ä¸åº”该挂载到uniCloud全局对象上。** + +**æ£ç¡®çš„全局å˜é‡ï¼Œåº”该使用如下方案:** - uni-config-center:é™æ€å…¨å±€å˜é‡å¯ä»¥ä½¿ç”¨uniæ供的é…ç½®ä¸å¿ƒã€‚[详è§](uni-config-center.md) -- redis:动æ€å˜é‡ä½¿ç”¨redis。[详è§](https://uniapp.dcloud.io/uniCloud/redis-introduction.html) +- redis:动æ€å…¨å±€å˜é‡ä½¿ç”¨redis。[详è§](redis-introduction.md) + +### 请求的上下文 + +由于上节æ到的,uniCloud全局对象是实例级的ã€è·¨è¯·æ±‚的,1个实例内uniCloudåªä¼šåœ¨å†·å¯åŠ¨æ—¶è¿›è¡Œä¸€æ¬¡åˆå§‹åŒ–。 + +所以与请求相关的上下文,比如客户端信æ¯ï¼Œéœ€è¦é€šè¿‡è¯·æ±‚æ¥èŽ·å–。 + +为了让开å‘者清晰的了解实例和请求的关系,uniCloudæ供了如下方案。 + +1. 通过uniCloud.getRequestList(),å¯ä»¥èŽ·å¾—当å‰å®žä¾‹çš„请求id列表 +æ¯ä¸ªè¯·æ±‚,都有一个requestId,在è¿è¡Œå›žè°ƒé‡Œã€äº‘端日志里都有体现。 +```js +uniCloud.getRequestList() +// 返回值:['3228166e-3c17-4d58-9707-xxxxxxxx'] +``` + + - 如果未é…置阿里云的å•å®žä¾‹å¤šå¹¶å‘,getRequestList()返回的数组里é¢åªæœ‰ä¸€é¡¹ï¼Œå³åªèƒ½æ‹¿åˆ°å½“å‰çš„请求id。 + - 如果é…置了阿里云的å•å®žä¾‹å¤šå¹¶å‘,当并å‘å‘生时,这个列表就会返回多项,当å‰å¹¶å‘çš„æ¯ä¸ªrequestId都在里é¢ã€‚ + +2. uniCloud.getClientInfos(),å¯ä»¥è¿”回当å‰æ‰€æœ‰è¯·æ±‚的客户端信æ¯ã€‚ +该方法返回一个数组,当å‰æ¯ä¸ªå¹¶å‘执行ä¸çš„请求的客户端信æ¯éƒ½åœ¨é‡Œé¢ã€‚ +```json +[ + { + "appId": "__UNI_xxxxx", + "requestId": "3228166e-3c17-4d58-9707-xxxxxxxx" + // ... + } +] +``` + + - 如果未é…置阿里云的å•å®žä¾‹å¤šå¹¶å‘,getRequestList()返回的数组里é¢åªæœ‰ä¸€é¡¹ï¼Œå³åªèƒ½æ‹¿åˆ°å½“å‰çš„请求id。 + - 如果é…置了阿里云的å•å®žä¾‹å¤šå¹¶å‘,当并å‘å‘生时,这个列表就会返回多项,当å‰å¹¶å‘çš„æ¯ä¸ªrequestId都在里é¢ã€‚ + +3. + +如果是uniCloudç§æœ‰äº‘, +如果想获å–与请求相关的信æ¯ï¼Œæ¯”如这次请求的客户端UA,或云函数环境信æ¯ï¼Œæ— 法直接在uniCloud全局对象ä¸èŽ·å–。 + + +云函数入å£å…¥å‚包å«ä¸€ä¸ªevent和一个context,这两个å‚数和请求相关,æ¯æ¬¡æœ‰æ–°è¯·æ±‚到云函数实例时就会有一个新的event对象和一个新的context对象 + +云对象的thiså’Œeventã€context类似,æ¯ä¸ªè¯·æ±‚都对应一个å•ç‹¬çš„this。 + +### å•å®žä¾‹å¤šå¹¶å‘@concurrency + +> ä»…é˜¿é‡Œäº‘æ”¯æŒ + +默认情况下云函数仅支æŒå•å®žä¾‹å•å¹¶å‘,å³åŒä¸€æ—¶é—´ä¸€ä¸ªå®žä¾‹ä»…å¯ä¸ºä¸€ä¸ªè¯·æ±‚æœåŠ¡ï¼ˆä¸åŒè¯·æ±‚åŒä¸€æ—¶é—´è®¿é—®ä¼šè¢«åˆ†æ´¾åˆ°ä¸åŒå®žä¾‹è¿›è¡Œå¤„ç†ï¼‰ã€‚ä¸è¿‡åœ¨uniCloud web控制å°ä¸ï¼Œé˜¿é‡Œäº‘å¯ä»¥é€šè¿‡ä¿®æ”¹äº‘函数å•å®žä¾‹å¹¶å‘度,å¯ä»¥ä¿®æ”¹äº‘函数åŒä¸€æ—¶é—´æœ€å¤šèƒ½å¤„ç†å¤šå°‘请求。 + +å‡è®¾åŒæ—¶æœ‰3个请求需è¦å¤„ç†ï¼š + +当实例并å‘度设置为1时,需è¦åˆ›å»º3个实例æ¥å¤„ç†è¿™3个请求,æ¯ä¸ªå®žä¾‹åˆ†åˆ«å¤„ç†1个请求。而æ¯å¼€å¯ä¸€ä¸ªå®žä¾‹éƒ½ä¼šå¼•å‘云函数冷å¯åŠ¨ï¼› + +当云函数的实例并å‘度设置为10时(å³1个实例å¯ä»¥åŒæ—¶å¤„ç†10个请求),åªéœ€è¦åˆ›å»º1个实例就能处ç†è¿™3ä¸ªè¯·æ±‚ã€‚è¿™æ ·åŽé¢2个并å‘请求ä¸ä¼šæœ‰å› 云函数实例创建带æ¥çš„冷å¯åŠ¨é—®é¢˜ã€‚ + +相关文档:[云函数实例åŠéƒ¨åˆ†å˜é‡è¯´æ˜Ž](#instance) ã€[äº‘å‡½æ•°çš„æ— çŠ¶æ€](#state-less) + +**å¼€å¯æ–¹å¼** + +云函数详情页é¢é…ç½®å•å®žä¾‹å¹¶å‘度å³å¯ï¼Œæ”¯æŒ1-100之间的数值 + +**效果** + +- 有效å‡å°‘并å‘请求时云函数冷å¯åŠ¨æ¬¡æ•° + +**使用注æ„** + +- 虽然阿里云云函数支æŒé…置多并å‘,但在高并å‘下异æ¥è¯·æ±‚排队效果未必好于新开一个实例。尤其是并å‘æ“作数æ®åº“性能ä¸ä½³ã€‚**一般情况下ä¸è¦è®¾ç½®è¿‡å¤§çš„并å‘度,å¯ä»¥è‡ªå·±é’ˆå¯¹ä¸šåŠ¡ä»£ç 测试比较下是å¦å¯ç”¨å¹¶å‘或并å‘æ•°é…æˆå¤šå°‘** +- 云函数内å˜ä½¿ç”¨é‡ä¼šéšç€å¹¶å‘é‡å¢žå¤§è€Œå¢žåŠ ,过大的内å˜å¯èƒ½å¯¼è‡´OOM +- 注æ„云函数是有超时时间的。设置过大的å•å®žä¾‹å¤šå¹¶å‘å¯èƒ½ä¼šå¯¼è‡´å®žä¾‹åº•å±‚网络请求排队从而导致请求超时, +- 如果并å‘çš„ä¸åŒè¯·æ±‚对全局å˜é‡åŒæ—¶è¿›è¡Œè¯»å†™ä¼šæ±¡æŸ“全局å˜é‡ï¼Œå¯èƒ½ä¼šå¯¼è‡´æ„想ä¸åˆ°çš„åŽæžœï¼Œè¯¦è§[全局å˜é‡](#state-less) + +**适用场景** + +|场景 |适用性 |ç†ç”± | +|:-: |:-: |:-: | +|函数ä¸æœ‰è¾ƒå¤šæ—¶é—´åœ¨ç‰å¾…下游æœåŠ¡çš„å“应 |适用 |ç‰å¾…å“应一般ä¸æ¶ˆè€—资æºï¼Œåœ¨ä¸€ä¸ªå®žä¾‹å†…并å‘处ç†å¯ä»¥èŠ‚çœè´¹ç”¨ã€‚ | +|函数ä¸æœ‰å…±äº«çŠ¶æ€ä¸”ä¸èƒ½å¹¶å‘访问 |ä¸é€‚用 |例如全局å˜é‡ï¼Œå¤šè¯·æ±‚并å‘执行修改共享状æ€å¯èƒ½ä¼šå¯¼è‡´é”™è¯¯ã€‚ | +|å•ä¸ªè¯·æ±‚的执行è¦æ¶ˆè€—大é‡CPUåŠå†…å˜èµ„æº |ä¸é€‚用 |多请求并å‘æ‰§è¡Œä¼šé€ æˆèµ„æºäº‰æŠ¢ï¼Œå¯èƒ½ä¼šå¯¼è‡´å†…å˜ä¸è¶³ï¼ˆOOMï¼‰æˆ–è€…å»¶æ—¶å¢žåŠ ã€‚ | + +**关于旧版本uni-id公共模å—的特殊说明** + +旧版本uni-id公共模å—指uni-id-common推出之å‰çš„版本。[详è§](uni-id.md) + +```js +// å¼€å¯å•å®žä¾‹å¤šå¹¶å‘å‰çš„uni-id用法 +const uniID = require('uni-id') +exports.main = async function(event, context) { + const res = uniID.login({ + // ...一些å‚æ•° + }) + return res +} + +// 由于uni-id默认会从一个内置全局å˜é‡ä¸ŠèŽ·å–客户端平å°ä¿¡æ¯ï¼Œä¸åŒè¯·æ±‚会修改æ¤å…¨å±€å˜é‡å¯èƒ½é€ æˆæ··ä¹±ï¼Œå¼€å¯å•å®žä¾‹å¤šå¹¶å‘åŽéœ€è¦å°†uni-id修改为如下写法 +let uniID = require('uni-id') +exports.main = async function(event, context) { + let uniIDIns = uniID.createInstance({ // 创建uni-id实例,其上方法åŒuniID + context: context // ä¼ å…¥context防æ¢ä¸åŒè¯·æ±‚äº’ç›¸å½±å“ + // config: {} // 完整uni-idé…置信æ¯ï¼Œä½¿ç”¨config.json进行é…ç½®æ—¶æ— éœ€ä¼ æ¤å‚æ•° + }) + const res = uniIDIns.login({ + // ...一些å‚æ•° + }) + return res +} +``` + +ä¸åŒäºŽæ—§ç‰ˆuni-id公共模å—,新版uni-id-commonä¸å¯ç›´æŽ¥requireåŽä½¿ç”¨ï¼Œå¿…须使用createInstance方法 + +**进阶** + +å¼€å¯å•å®žä¾‹å¤šå¹¶å‘åŽçš„全局å˜é‡å¤ç”¨å¹¶éžä¸€å®šæ˜¯åçš„ç»“æžœï¼Œå¦‚æžœä½ å¾ˆäº†è§£æ¤è¡Œä¸ºï¼Œä¹Ÿå¯ä»¥å¯¹æ¤è¿›è¡Œæœ‰æ•ˆçš„利用 + +例:[ip-filter](https://ext.dcloud.net.cn/plugin?id=4619)ä¸å°±åˆ©ç”¨äº‘函数全局缓å˜ä¸€äº›ip访问信æ¯æ¥é™åˆ¶å•ip访问频率,å¯ä»¥ä¸‹è½½ç¤ºä¾‹é¡¹ç›®ä½“验一下 + +å—å•å®žä¾‹å¤šå¹¶å‘çš„å½±å“,云函数全局å˜æ”¾ä¸Žæœ¬æ¬¡è¯·æ±‚有关的信æ¯ä¼šé€ æˆæ··ä¹±ã€‚å› æ¤uniCloudæä¾›äº†æ ¹æ®å½“å‰requestId获å–客户端信æ¯å’Œäº‘端信æ¯ã€‚å‚考以下文档 + +- [云函数获å–当å‰requestId](cf-callfunction.md#context) +- [云对象获å–当å‰requestId](cloud-obj.md#get-request-id) +- [获å–当å‰äº‘函数实例æ£åœ¨å¤„ç†çš„请求对应的requestId列表](#get-request-list) +- [获å–当å‰äº‘函数实例æ£åœ¨å¤„ç†çš„请求对应的客户端信æ¯åˆ—表](#get-client-infos) +- [获å–当å‰äº‘函数实例æ£åœ¨å¤„ç†çš„请求对应的云端信æ¯åˆ—表](#get-cloud-infos) + ### 临时å˜å‚¨ç©ºé—´ 云函数是è¿è¡Œåœ¨äº‘端的代ç ,è¿è¡ŒçŽ¯å¢ƒç”±äº‘æœåŠ¡å™¨å¼¹æ€§è°ƒé…ï¼Œè¿™æ˜¯å’Œä¼ ç»Ÿ`Node.js`应用很大的区别。 -æ¢è¨€ä¹‹ï¼Œäº‘函数æ¯æ¬¡æ‰§è¡Œçš„宿主环境(å¯ç®€å•ç†è§£ä¸ºè™šæ‹Ÿæœºæˆ–æœåŠ¡å™¨ç¡¬ä»¶ï¼‰å¯èƒ½ç›¸åŒï¼Œä¹Ÿå¯èƒ½ä¸åŒï¼Œå› æ¤ä¼ 统`Node.js`å¼€å‘ä¸å°†éƒ¨åˆ†ä¿¡æ¯å˜å‚¨æœ¬åœ°ç¡¬ç›˜æˆ–内å˜çš„方案就ä¸å†é€‚åˆï¼Œå»ºè®®é€šè¿‡äº‘æ•°æ®åº“或云å˜å‚¨çš„方案替代。 +æ¢è¨€ä¹‹ï¼Œäº‘函数æ¯æ¬¡æ‰§è¡Œçš„宿主环境(å¯ç®€å•ç†è§£ä¸ºè™šæ‹Ÿæœºæˆ–æœåŠ¡å™¨ç¡¬ä»¶ï¼‰å¯èƒ½ç›¸åŒï¼Œä¹Ÿå¯èƒ½ä¸åŒï¼Œå› æ¤ä¼ 统`Node.js`å¼€å‘ä¸å°†éƒ¨åˆ†ä¿¡æ¯å˜å‚¨æœ¬åœ°ç¡¬ç›˜æˆ–内å˜çš„方案就ä¸å†é€‚åˆã€‚ + +所以,ä¸å»ºè®®ä½¿ç”¨nodeçš„fs文件系统相关的API。建议通过云数æ®åº“ã€äº‘å˜å‚¨ã€redis的方案替代。 ### 云函数ä¸çš„异æ¥è¡Œä¸º @@ -853,9 +1019,27 @@ exports.main = async function() { **è…¾è®¯äº‘å› ä¸ºæŒ‰ GBS 对云函数计费,在 node12 时,尤其è¦æ³¨æ„,如果未有效终æ¢äº‘函数,会一直计费** +### node版本 +云函数è¿è¡Œåœ¨ node 环境ä¸ã€‚å¯ä»¥ä½¿ç”¨ node api `process.version` èŽ·å– node 版本。 + +- uniCloud 阿里云默认是 node8.17.0,也å¯ä»¥åœ¨ package.json ä¸é€‰æ‹© node12 +- uniCloud 腾讯云默认是 node8.9.4,也å¯ä»¥åœ¨ package.json ä¸é€‰æ‹© node12 +- HBuilderX 本地è¿è¡ŒçŽ¯å¢ƒä½¿ç”¨çš„是 HBuilderX 自带的 node 版本,目å‰ä¸º node12。在 package.json 选择 node版本 åªäº‘端生效,且åªåœ¨ç¬¬ä¸€æ¬¡ä¸Šä¼ 云函数时生效。 + +**注æ„** +- 本地开å‘一旦使用了 node12 的专用 apiï¼Œä¸Šä¼ äº‘å‡½æ•°æ—¶å¿…é¡»åœ¨package.json里手动é…置选择 node12 çš„è¿è¡ŒçŽ¯å¢ƒã€‚ + 之所以没有在云端默认统一使用 node12ï¼Œæ˜¯å› ä¸ºè…¾è®¯äº‘ node12 çš„ return ç–略有一些特殊情况,[è§ä¸‹](?id=return)。 +- è¿è¡ŒçŽ¯å¢ƒåœ¨äº‘端云函数创建时设定,ä¸å¯é€šè¿‡æ›´æ–°äº‘函数æ¥ä¿®æ”¹ã€‚ + ä¹Ÿå°±æ˜¯ç¬¬ä¸€æ¬¡ä¸Šä¼ äº‘å‡½æ•°çš„æ—¶å€™ï¼Œpackage.json里é…了什么,就是什么。如果需è¦ä¿®æ”¹nodeçŽ¯å¢ƒï¼Œéœ€å…ˆåˆ é™¤äº‘ç«¯äº‘å‡½æ•°ï¼Œé‡æ–°ä¸Šä¼ 。 + +node版本å¯ä»¥åœ¨äº‘函数的package.json文件的`cloudfunction-config->runtime`å—段进行é…置,详情å‚考:[云函数package.json](uniCloud/cf-functions.md?id=packagejson) + + ### 时区 -- 云端的云函数ä¸ä½¿ç”¨çš„时区是 `UTC+0`,而ä¸æ˜¯ `UTC+8`,在云函数ä¸ä½¿ç”¨æ—¶é—´æ—¶éœ€ç‰¹åˆ«æ³¨æ„。云函数在HBuilderX本地è¿è¡Œæ—¶ï¼Œæ—¶åŒºåˆ™æ˜¯ç”µè„‘的时区,很å¯èƒ½æ˜¯ `UTC+8`。建议使用时间戳,å¯ä»¥è§„é¿æ—¶åŒºé—®é¢˜ã€‚ +云端的云函数ä¸ä½¿ç”¨çš„时区是 `UTC+0`,而ä¸æ˜¯ `UTC+8`,在云函数ä¸ä½¿ç”¨æ—¶é—´æ—¶éœ€ç‰¹åˆ«æ³¨æ„。 + +云函数在HBuilderX本地è¿è¡Œæ—¶ï¼Œæ—¶åŒºåˆ™æ˜¯ç”µè„‘的时区,很å¯èƒ½æ˜¯ `UTC+8`。建议统一使用时间戳,å¯ä»¥è§„é¿æ—¶åŒºé—®é¢˜ã€‚ ## 云函数é…ç½® @@ -877,8 +1061,7 @@ serverless默认是没有固定的æœåŠ¡å™¨IPçš„ï¼Œå› ä¸ºæœ‰å¾ˆå¤šæœåŠ¡å™¨èµ„ 但一些三方系统,è¦æ±‚é…置固定ip白åå•ï¼Œæ¯”如微信公众å·çš„js sdk,æ¤æ—¶åªèƒ½æ供固定ip地å€ã€‚ -ç›®å‰è…¾è®¯äº‘的收费版,æ供了云函数的固定出å£ip。ip属于有价资æºï¼Œé˜¿é‡Œäº‘和腾讯云的å…费版ä¸æ供这方é¢çš„能力。 -> å¦‚æžœå› æ¤ä½ 想è¦åˆ‡æ¢äº‘厂商,需è¦æŠŠuniCloud阿里云版ä¸çš„æ•°æ®ï¼Œè¿ç§»åˆ°è…¾è®¯äº‘版。å‚考:[云厂商之间的è¿ç§»](https://uniapp.dcloud.io/uniCloud/hellodb?id=cross-provider) +ç›®å‰è…¾è®¯äº‘的收费版,æ供了云函数的固定出å£ip 在uniCloud [Web控制å°](https://unicloud.dcloud.net.cn),创建付费的腾讯云æœåŠ¡ç©ºé—´ï¼Œé€‰æ‹©ä¸€ä¸ªäº‘函数,在云函数的详情界é¢å¯ä»¥å¼€å¯å›ºå®šå‡ºå£ip。开å¯åŽç•Œé¢ä¸Šä¼šæ˜¾ç¤ºå¯ç”¨çš„固定ip。拿ç€è¿™ä¸ªip去需è¦å›ºå®šipçš„ç•Œé¢ï¼ˆå¦‚微信公众å·ç®¡ç†ç•Œé¢ï¼‰é…ç½®å³å¯ã€‚ @@ -886,7 +1069,6 @@ serverless默认是没有固定的æœåŠ¡å™¨IPçš„ï¼Œå› ä¸ºæœ‰å¾ˆå¤šæœåŠ¡å™¨èµ„ - å¦‚æžœä½ æ˜¯å…费版å‡é…到付费版,开å¯`固定IP`功能åŽï¼Œä¼šå¯¼è‡´ä»˜è´¹ç‰ˆåˆ°æœŸæ— 法自动é™çº§åˆ°å…费版,请注æ„按时ç»è´¹ - 腾讯云原本的设计是åŒä¸€ä¸ªæœåŠ¡ç©ºé—´å†…所有开å¯å›ºå®šå‡ºå£IP的云函数使用的是åŒä¸€ä¸ªIP。但是对于开通vpcçš„äº‘å‡½æ•°æ— æ³•å’Œæœªå¼€é€švpc的函数共用åŒä¸€ä¸ªå‡ºå£ip。具体使用ä¸æœ‰ä»¥ä¸‹è¡¨çŽ° - 开通redis扩展的云函数和未开通redis扩展的云函数会分é…ä¸åŒçš„ip @@ -896,7 +1078,7 @@ serverless默认是没有固定的æœåŠ¡å™¨IPçš„ï¼Œå› ä¸ºæœ‰å¾ˆå¤šæœåŠ¡å™¨èµ„ #### 阿里云@aliyun-eip -> 新增于 HBuilderX 3.5.5ï¼Œä»…é˜¿é‡Œäº‘æ”¯æŒ +> 新增于 HBuilderX 3.5.5 uniCloud.httpProxyForEip ,其原ç†æ˜¯é€šè¿‡ä»£ç†è¯·æ±‚获得固定出å£IP的能力。IP为轮转ä¸å›ºå®šï¼Œå› æ¤ä¸‰æ–¹æœåŠ¡è¦æ±‚使用白åå•æ—¶å¼€å‘者需è¦å°†ä»£ç†æœåŠ¡å™¨å¯èƒ½çš„IPå‡åŠ 入到白åå•ä¸ï¼Œè§ä¸‹æ–¹ä»£ç†æœåŠ¡å™¨åˆ—表。æ¤å¤–对于代ç†çš„域å有é™åˆ¶ï¼Œå½“å‰ä»…æŒ`weixin.qq.com`泛域å。若开å‘者有其他域å代ç†éœ€æ±‚,å‘é€é‚®ä»¶åˆ°service@dcloud.io申请。 @@ -1003,86 +1185,6 @@ uniCloud.httpProxyForEip.post( - 代ç†è¯·æ±‚超时时间为5秒 - 上述接å£æ”¯æŒæœ¬åœ°è¿è¡Œ -### å•å®žä¾‹å¤šå¹¶å‘@concurrency - -> ä»…é˜¿é‡Œäº‘æ”¯æŒ - -所谓实例是指云函数的一个执行环境,å¯ä»¥ç®€å•çš„ç†è§£ä¸ºä¸€ä¸ªnode进程。客户端å‘起的请求都会由一个个的云函数实例进行处ç†ã€‚ - -默认情况下云函数仅支æŒå•å®žä¾‹å•å¹¶å‘,å³åŒä¸€æ—¶é—´ä¸€ä¸ªå®žä¾‹ä»…å¯ä¸ºä¸€ä¸ªè¯·æ±‚æœåŠ¡ï¼ˆä¸åŒè¯·æ±‚åŒä¸€æ—¶é—´è®¿é—®ä¼šè¢«åˆ†æ´¾åˆ°ä¸åŒå®žä¾‹è¿›è¡Œå¤„ç†ï¼‰ã€‚通过修改云函数å•å®žä¾‹å¹¶å‘度,å¯ä»¥ä¿®æ”¹äº‘函数åŒä¸€æ—¶é—´æœ€å¤šèƒ½å¤„ç†å¤šå°‘请求。 - -å‡è®¾åŒæ—¶æœ‰3个请求需è¦å¤„ç†ï¼š - -当实例并å‘度设置为1时,需è¦åˆ›å»º3个实例æ¥å¤„ç†è¿™3个请求,æ¯ä¸ªå®žä¾‹åˆ†åˆ«å¤„ç†1个请求。而æ¯å¼€å¯ä¸€ä¸ªå®žä¾‹éƒ½ä¼šå¼•å‘云函数冷å¯åŠ¨ï¼› - -当云函数的实例并å‘度设置为10时(å³1个实例å¯ä»¥åŒæ—¶å¤„ç†10个请求),åªéœ€è¦åˆ›å»º1个实例就能处ç†è¿™3ä¸ªè¯·æ±‚ã€‚è¿™æ ·åŽé¢2个并å‘请求ä¸ä¼šæœ‰å› 云函数实例创建带æ¥çš„冷å¯åŠ¨é—®é¢˜ã€‚ - -相关文档:[云函数实例åŠéƒ¨åˆ†å˜é‡è¯´æ˜Ž](#instance) ã€[äº‘å‡½æ•°çš„æ— çŠ¶æ€](#state-less) - -**å¼€å¯æ–¹å¼** - -云函数详情页é¢é…ç½®å•å®žä¾‹å¹¶å‘度å³å¯ï¼Œæ”¯æŒ1-100之间的数值 - -**效果** - -- 有效å‡å°‘并å‘请求时云函数冷å¯åŠ¨æ¬¡æ•° - -**使用注æ„** - -- 适用于云函数连接三方æœåŠ¡å™¨çš„åœºæ™¯ï¼Œå¦‚æžœä½ çš„äº‘å‡½æ•°åªå¤„ç†æ•°æ®åº“请求,ä¸è¦ä¿®æ”¹æ¤é…置,ä¿æŒä¸º1å³å¯ -- 云函数内å˜ä½¿ç”¨é‡ä¼šéšç€å¹¶å‘é‡å¢žå¤§è€Œå¢žåŠ -- 如果并å‘çš„ä¸åŒè¯·æ±‚对全局å˜é‡åŒæ—¶è¿›è¡Œè¯»å†™ä¼šæ±¡æŸ“全局å˜é‡ï¼Œå¯èƒ½ä¼šå¯¼è‡´æ„想ä¸åˆ°çš„åŽæžœï¼Œå¼€å¯å•å®žä¾‹å¤šå¹¶å‘åŽè¯·ä¸è¦ç¼–写修改全局å˜é‡çš„代ç ,除éžä½ 熟悉这ç§æŠ€æœ¯å¸¦æ¥çš„特殊应用,比如下文进阶部分æ到的ip过滤。 -- 设置过大的å•å®žä¾‹å¤šå¹¶å‘å¯èƒ½ä¼šå¯¼è‡´å®žä¾‹åº•å±‚网络请求排队从而导致请求超时,**一般情况下ä¸è¦è®¾ç½®è¿‡å¤§çš„并å‘度,具体数值å¯ä»¥è‡ªå·±é’ˆå¯¹ä¸šåŠ¡ä»£ç 测试一下** - -**适用场景** - -|场景 |适用性 |ç†ç”± | -|:-: |:-: |:-: | -|函数ä¸æœ‰è¾ƒå¤šæ—¶é—´åœ¨ç‰å¾…下游æœåŠ¡çš„å“应 |适用 |ç‰å¾…å“应一般ä¸æ¶ˆè€—资æºï¼Œåœ¨ä¸€ä¸ªå®žä¾‹å†…并å‘处ç†å¯ä»¥èŠ‚çœè´¹ç”¨ã€‚ | -|函数ä¸æœ‰å…±äº«çŠ¶æ€ä¸”ä¸èƒ½å¹¶å‘访问 |ä¸é€‚用 |例如全局å˜é‡ï¼Œå¤šè¯·æ±‚并å‘执行修改共享状æ€å¯èƒ½ä¼šå¯¼è‡´é”™è¯¯ã€‚ | -|å•ä¸ªè¯·æ±‚的执行è¦æ¶ˆè€—大é‡CPUåŠå†…å˜èµ„æº |ä¸é€‚用 |多请求并å‘æ‰§è¡Œä¼šé€ æˆèµ„æºäº‰æŠ¢ï¼Œå¯èƒ½ä¼šå¯¼è‡´å†…å˜ä¸è¶³ï¼ˆOOMï¼‰æˆ–è€…å»¶æ—¶å¢žåŠ ã€‚ | - -**关于旧版本uni-id公共模å—的特殊说明** - -```js -// å¼€å¯å•å®žä¾‹å¤šå¹¶å‘å‰çš„uni-id用法 -const uniID = require('uni-id') -exports.main = async function(event, context) { - const res = uniID.login({ - // ...一些å‚æ•° - }) - return res -} - -// 由于uni-id默认会从一个内置全局å˜é‡ä¸ŠèŽ·å–客户端平å°ä¿¡æ¯ï¼Œä¸åŒè¯·æ±‚会修改æ¤å…¨å±€å˜é‡å¯èƒ½é€ æˆæ··ä¹±ï¼Œå¼€å¯å•å®žä¾‹å¤šå¹¶å‘åŽéœ€è¦å°†uni-id修改为如下写法 -let uniID = require('uni-id') -exports.main = async function(event, context) { - let uniIDIns = uniID.createInstance({ // 创建uni-id实例,其上方法åŒuniID - context: context // ä¼ å…¥context防æ¢ä¸åŒè¯·æ±‚äº’ç›¸å½±å“ - // config: {} // 完整uni-idé…置信æ¯ï¼Œä½¿ç”¨config.json进行é…ç½®æ—¶æ— éœ€ä¼ æ¤å‚æ•° - }) - const res = uniIDIns.login({ - // ...一些å‚æ•° - }) - return res -} -``` - -ä¸åŒäºŽæ—§ç‰ˆuni-id公共模å—uni-id-commonä¸å¯ç›´æŽ¥requireåŽä½¿ç”¨ï¼Œå¿…须使用createInstance方法 - -**进阶** - -å¼€å¯å•å®žä¾‹å¤šå¹¶å‘åŽçš„全局å˜é‡å¤ç”¨å¹¶éžä¸€å®šæ˜¯åçš„ç»“æžœï¼Œå¦‚æžœä½ å¾ˆäº†è§£æ¤è¡Œä¸ºï¼Œä¹Ÿå¯ä»¥å¯¹æ¤è¿›è¡Œæœ‰æ•ˆçš„利用 - -例:[ip-filter](https://ext.dcloud.net.cn/plugin?id=4619)ä¸å°±åˆ©ç”¨äº‘函数全局缓å˜ä¸€äº›ip访问信æ¯æ¥é™åˆ¶å•ip访问频率,å¯ä»¥ä¸‹è½½ç¤ºä¾‹é¡¹ç›®ä½“验一下 - -å—å•å®žä¾‹å¤šå¹¶å‘çš„å½±å“,云函数全局å˜æ”¾ä¸Žæœ¬æ¬¡è¯·æ±‚有关的信æ¯ä¼šé€ æˆæ··ä¹±ã€‚å› æ¤uniCloudæä¾›äº†æ ¹æ®å½“å‰requestId获å–客户端信æ¯å’Œäº‘端信æ¯ã€‚å‚考以下文档 - -- [云函数获å–当å‰requestId](cf-callfunction.md#context) -- [云对象获å–当å‰requestId](cloud-obj.md#get-request-id) -- [获å–当å‰äº‘函数实例æ£åœ¨å¤„ç†çš„请求对应的requestId列表](#get-request-list) -- [获å–当å‰äº‘函数实例æ£åœ¨å¤„ç†çš„请求对应的客户端信æ¯åˆ—表](#get-client-infos) -- [获å–当å‰äº‘函数实例æ£åœ¨å¤„ç†çš„请求对应的云端信æ¯åˆ—表](#get-cloud-infos) ## 云函数package.json@packagejson