提交 122df0a8 编写于 作者: hbcui1984's avatar hbcui1984

Update cf-functions.md

上级 bc372bf7
### 简介 ## 简介
云函数是运行在云端的 `JavaScript` 代码,和普通的`Node.js`开发一样,熟悉`Node.js`的开发者可以直接上手。 云函数是运行在云端的 `JavaScript` 代码,和普通的`Node.js`开发一样,熟悉`Node.js`的开发者可以直接上手。
...@@ -36,11 +36,11 @@ exports.main = async (event, context) => { ...@@ -36,11 +36,11 @@ exports.main = async (event, context) => {
- 服务商为阿里云时,暂不可使用相对路径读取文件(比如`fs.readFileSync('./info.txt')`),可以使用绝对路径`fs.readFileSync(path.resolve(__dirname,'./info.txt'))` - 服务商为阿里云时,暂不可使用相对路径读取文件(比如`fs.readFileSync('./info.txt')`),可以使用绝对路径`fs.readFileSync(path.resolve(__dirname,'./info.txt'))`
### 访问数据库 ## 访问数据库
云函数中支持访问本服务空间下的数据库,调用方式详见[规范](uniCloud/cf-database.md) 云函数中支持访问本服务空间下的数据库,调用方式详见[规范](uniCloud/cf-database.md)
### 访问HTTP服务 ## 访问HTTP服务
`uniCloud`提供了`uniCloud.httpclient`供开发者使用。无需额外依赖,就可以请求任何 HTTP 和 HTTPS 协议的 Web 服务。`uniCloud.httpclient`返回的是一个[urllib实例](https://github.com/node-modules/urllib) `uniCloud`提供了`uniCloud.httpclient`供开发者使用。无需额外依赖,就可以请求任何 HTTP 和 HTTPS 协议的 Web 服务。`uniCloud.httpclient`返回的是一个[urllib实例](https://github.com/node-modules/urllib)
...@@ -165,7 +165,7 @@ exports.main = async function(event) { ...@@ -165,7 +165,7 @@ exports.main = async function(event) {
``` ```
--> -->
### 使用npm ## 使用npm
在云函数中我们可以引入第三方依赖来帮助我们更快的开发。云函数的运行环境是 `Node.js`,因此我们可以使用 `npm` 安装第三方依赖。 在云函数中我们可以引入第三方依赖来帮助我们更快的开发。云函数的运行环境是 `Node.js`,因此我们可以使用 `npm` 安装第三方依赖。
...@@ -174,7 +174,7 @@ exports.main = async function(event) { ...@@ -174,7 +174,7 @@ exports.main = async function(event) {
Tips: Tips:
- 目前每个云函数上传包大小限制为10M。 - 目前每个云函数上传包大小限制为10M。
### 客户端调用云函数 ## 客户端调用云函数
前端代码(H5前端、App、小程序),不再执行uni.request联网,而是通过`uniCloud.callFunction`调用云函数,`callFunction`定义如下: 前端代码(H5前端、App、小程序),不再执行uni.request联网,而是通过`uniCloud.callFunction`调用云函数,`callFunction`定义如下:
...@@ -214,33 +214,6 @@ uniCloud.callFunction({ ...@@ -214,33 +214,6 @@ uniCloud.callFunction({
目前仅支持客户端调用云函数,即将支持云函数调用云函数。 目前仅支持客户端调用云函数,即将支持云函数调用云函数。
### 注意事项
云函数是运行在云端的代码,运行环境由云服务器弹性调配,这是和传统`Node.js`应用很大的区别。
换言之,云函数每次执行的宿主环境(可简单理解为虚拟机或服务器硬件)可能相同,也可能不同,因此传统`Node.js`开发中将部分信息存储本地硬盘或内存的方案就不再适合,建议通过云数据库或云存储的方案替代。
另一方面,鉴于云函数的弹性调配机制,为提高运行性能,部分云厂商在一定时间周期内会复用相同的云函数实例,此时为避免数据污染,建议使用无状态的风格编写函数代码。
以如下代码为例,`count`作为全局变量,当多次调用该云函数时,可能会出现变量累加的情况(实例未复用时,每次返回0,若实例被复用,则可能返回1、2、3等各种意外情况)
```javascript
let count = 0;
module.exports = async (event) => {
return count++
//此示例为错误示例
//云函数实例未复用时,每次返回0
//若实例被复用,则可能返回1、2、3等各种意外情况
}
```
**Tips**
- 云函数中使用的时区是 `UTC+0`,而不是 `UTC+8`,在云函数中使用时间时需特别注意。
- 使用阿里云作为服务商时,暂时无法使用相对路径读取文件,如:`fs.readFileSync('./info')`,可以替换为`fs.readFileSync(path.resolve(__dirname,'./info'))`
## 云函数中调用云函数@callbyfunction ## 云函数中调用云函数@callbyfunction
用法同客户端调用云函数,不支持callback形式 用法同客户端调用云函数,不支持callback形式
...@@ -270,7 +243,47 @@ let callFunctionResult = await uniCloud.callFunction({ ...@@ -270,7 +243,47 @@ let callFunctionResult = await uniCloud.callFunction({
}) })
``` ```
### 注意事项 ## 注意事项
### 云函数的启动模式(冷启动、热启动)
基于云函数按需执行的特点, 函数在不被触发的时候, 计算资源是不被激活的。
当一个云函数初次被触发时,其完整过程如下:
1. 实例化计算实例
2. 加载函数代码
3. 启动 node
4. 执行代码
函数被调用时,执行这些完整步骤的过程一般称作冷启动, 冷启动的耗时往往比较长.
而如果函数实例和执行进程都被复用的情况下一般被定义为热启动, 热启动的性能较冷启动要好很多.
如果一个云函数实例长时间没有被再次调用,则该计算实例会被销毁;将来再次调用该云函数时,就会再次触发云函数的冷启动。
因为存在冷热启动的差异,云函数中的全局变量就可能出现每次不一样的情况。
以如下代码为例,`count`作为全局变量,当多次调用该云函数时,可能会出现变量累加的情况(实例未复用时,每次返回0,若实例被复用,则可能返回1、2、3等各种意外情况)
```javascript
let count = 0;
module.exports = async (event) => {
return count++
//此示例为错误示例
//云函数实例未复用时,每次返回0
//若实例被复用,则可能返回1、2、3等各种意外情况
}
```
### 临时存储空间
云函数是运行在云端的代码,运行环境由云服务器弹性调配,这是和传统`Node.js`应用很大的区别。
换言之,云函数每次执行的宿主环境(可简单理解为虚拟机或服务器硬件)可能相同,也可能不同,因此传统`Node.js`开发中将部分信息存储本地硬盘或内存的方案就不再适合,建议通过云数据库或云存储的方案替代。
### 云函数中的异步行为
书写云函数时应注意`async``await`的使用,`nodejs`有内置模块`util`可以将符合`error-first`形式`callback`的函数转换为`promise`形式,[详情参考](https://nodejs.org/api/util.html#util_util_promisify_original),比如以下示例: 书写云函数时应注意`async``await`的使用,`nodejs`有内置模块`util`可以将符合`error-first`形式`callback`的函数转换为`promise`形式,[详情参考](https://nodejs.org/api/util.html#util_util_promisify_original),比如以下示例:
...@@ -296,4 +309,13 @@ exports.main = async function() { ...@@ -296,4 +309,13 @@ exports.main = async function() {
return val return val
} }
``` ```
\ No newline at end of file
### 其它
- 云函数中使用的时区是 `UTC+0`,而不是 `UTC+8`,在云函数中使用时间时需特别注意。
- 使用阿里云作为服务商时,暂时无法使用相对路径读取文件,如:`fs.readFileSync('./info')`,可以替换为`fs.readFileSync(path.resolve(__dirname,'./info'))`
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册