cf-functions.md 4.9 KB
Newer Older
hbcui1984's avatar
hbcui1984 已提交
1

hbcui1984's avatar
hbcui1984 已提交
2
### 简介
雪洛's avatar
雪洛 已提交
3

hbcui1984's avatar
hbcui1984 已提交
4 5
云函数是运行在云端的 `JavaScript` 代码,和普通的`Node.js`开发一样,熟悉`Node.js`的开发者可以直接上手。

hbcui1984's avatar
hbcui1984 已提交
6
如下是将传入的两个参数求和并返回客户端的云函数代码示例:
雪洛's avatar
雪洛 已提交
7 8 9 10 11

```
'use strict';
exports.main = async (event, context) => {
	//event为客户端上传的参数
hbcui1984's avatar
hbcui1984 已提交
12 13 14
	return {
    sum:event.a + event.b
  }
雪洛's avatar
雪洛 已提交
15 16 17
}
```

hbcui1984's avatar
hbcui1984 已提交
18
云函数的传入参数有两个,一个是`event`对象,一个是`context`对象。`event`指的是触发云函数的事件,当客户端调用云函数时,`event`就是客户端调用云函数时传入的参数。`context` 对象包含了此处调用的调用信息和运行状态,可以用它来了解服务运行的情况。`uniCloud`会自动将客户端的操作系统(`os`)、运行平台(`platform`)、应用信息(`appid`)等注入`contxt`中,开发者可通过`context`获取每次调用的上下文,如下是一个示例:
雪洛's avatar
雪洛 已提交
19

雪洛's avatar
雪洛 已提交
20
```
hbcui1984's avatar
hbcui1984 已提交
21 22 23 24 25 26 27 28
'use strict';
exports.main = async (event, context) => {
	//event为客户端上传的参数
  ...
  //context中可获取客户端调用的上下文
  let os = context.OS //客户端操作系统,返回值:android、ios	等
  let platform = context.PLATFORM //运行平台,返回值为 mp-weixin、app-plus等
  let appid = context.APPID // manifest.json中配置的appid
hbcui1984's avatar
hbcui1984 已提交
29
	... //其它业务代码
hbcui1984's avatar
hbcui1984 已提交
30
}
雪洛's avatar
雪洛 已提交
31
```
雪洛's avatar
雪洛 已提交
32

hbcui1984's avatar
hbcui1984 已提交
33 34 35 36 37 38
### 访问数据库

云函数中支持访问本服务空间下的数据库,调用方式详见[规范](cf-database.md)

### 访问HTTP服务

hbcui1984's avatar
hbcui1984 已提交
39
`uniCloud`提供了`uniCloud.httpclient`供开发者使用。无需额外依赖,就可以请求任何 HTTP 和 HTTPS 协议的 Web 服务。`uniCloud.httpclient`返回的是一个[urllib实例](https://github.com/node-modules/urllib)
雪洛's avatar
雪洛 已提交
40 41 42 43 44 45 46 47 48 49 50 51

**示例代码**

```
const res = await uniCloud.httpclient.request(apiUrl, {
    method: 'POST',
    data: {
      test: 'testValue'
    }
  })
console.log(res)
```
雪洛's avatar
雪洛 已提交
52

hbcui1984's avatar
hbcui1984 已提交
53
### 使用npm
雪洛's avatar
雪洛 已提交
54

hbcui1984's avatar
hbcui1984 已提交
55
在云函数中我们可以引入第三方依赖来帮助我们更快的开发。云函数的运行环境是 `Node.js`,因此我们可以使用 `npm` 安装第三方依赖。
雪洛's avatar
雪洛 已提交
56

hbcui1984's avatar
hbcui1984 已提交
57
注意:鉴于阿里云的限制,目前仅支持全量上传云函数(整个 node_modules文件夹全部上传),因此提醒大家,精简依赖,否则可能会每次上传时间很慢,影响开发体验。
雪洛's avatar
雪洛 已提交
58

hbcui1984's avatar
hbcui1984 已提交
59 60
Tips:
- 目前每个云函数上传包大小限制为10M。
雪洛's avatar
雪洛 已提交
61

hbcui1984's avatar
hbcui1984 已提交
62
### 客户端调用云函数
hbcui1984's avatar
hbcui1984 已提交
63

hbcui1984's avatar
hbcui1984 已提交
64
客户端可通过`callFunction`调用云函数,`callFunction`定义如下:
hbcui1984's avatar
hbcui1984 已提交
65

hbcui1984's avatar
hbcui1984 已提交
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
#### 请求参数

|字段	|类型	|必填	|说明		|
|:-:	|:-:	|:-:	|:-:		|
|name	|String	|是		|云函数名称|
|data	|Object	|否		|客户端需要传递的参数|

#### 响应参数

|字段		|类型	|说明						|
|:-:		|:-:	|:-:						|
|result		|Object	|云函数执行结果				|
|requestId	|String	|请求序列号,用于错误排查	|

#### 示例代码

```javascript
// promise
uniClient.callFunction({
    name: 'test',
    data: { a: 1 }
  })
  .then(res => {});

// callback
uniClient.callFunction({
	name: 'test',
	data: { a: 1 },
	success(){},
	fail(){},
	complete(){}
});
```

目前仅支持客户端调用云函数,即将支持云函数调用云函数。
hbcui1984's avatar
hbcui1984 已提交
101 102 103 104 105 106 107 108 109 110

### 注意事项

云函数是运行在云端的代码,运行环境由云服务器弹性调配,这是和传统`Node.js`应用很大的区别。

换言之,云函数每次执行的宿主环境(可简单理解为虚拟机或服务器硬件)可能相同,也可能不同,因此传统`Node.js`开发中将部分信息存储本地硬盘或内存的方案就不再适合,建议通过云数据库或云存储的方案替代。

另一方面,鉴于云函数的弹性调配机制,为提高运行性能,部分云厂商在一定时间周期内会复用相同的云函数实例,此时为避免数据污染,建议使用无状态的风格编写函数代码。

以如下代码为例,`count`作为全局变量,当多次调用该云函数时,可能会出现变量累加的情况(实例未复用时,每次返回0,若实例被复用,则可能返回1、2、3等各种意外情况)
雪洛's avatar
雪洛 已提交
111 112 113 114 115 116 117 118

```javascript
let count = 0;
module.exports = async (context) => {
  return count++
}
```

hbcui1984's avatar
hbcui1984 已提交
119

hbcui1984's avatar
hbcui1984 已提交
120
<!-- 
雪洛's avatar
雪洛 已提交
121
## uniCloud.callFunction(Object callFunctionOptions)
雪洛's avatar
雪洛 已提交
122

雪洛's avatar
雪洛 已提交
123
云函数中调用云函数。**目前仅腾讯云支持**
雪洛's avatar
雪洛 已提交
124

雪洛's avatar
雪洛 已提交
125
**callFunctionOptions参数说明**
雪洛's avatar
雪洛 已提交
126

雪洛's avatar
雪洛 已提交
127 128 129 130 131
|字段			|类型			|必填	|说明					|
|---			|---			|---	|---					|
|name			|String		|是		|云函数名称。	|
|data			|Object		|否		|云函数参数。	|
|callback	|Function	|否		|回调函数。		|
雪洛's avatar
雪洛 已提交
132

雪洛's avatar
雪洛 已提交
133
**响应参数**
雪洛's avatar
雪洛 已提交
134

雪洛's avatar
雪洛 已提交
135 136 137 138 139 140
|字段			|类型		|必备	|说明												|
|---			|---		|---	|---												|
|errCode	|String	|否		|状态码,操作成功则不返回。	|
|errMsg		|String	|否		|错误描述。									|
|result		|Object	|否		|云函数执行结果。						|
|requestId|String	|否		|请求序列号,用于错误排查。	|
雪洛's avatar
雪洛 已提交
141

雪洛's avatar
雪洛 已提交
142
**示例代码**
雪洛's avatar
雪洛 已提交
143 144 145 146 147 148 149 150 151

```javascript
//promise
uniCloud.callFunction({
    name: "test",
    data: { a: 1 }
}).then((res) => {
    
});
hbcui1984's avatar
hbcui1984 已提交
152 153 154
```

 -->