
# Node.js函数开发概述
FunctionGraph当前支持以下Node.js运行环境：
- Node.js 6.10
- Node.js 8.10
- Nodejs 10.16
- Nodejs 12.13
- Node.js 14.18
- Node.js 16.17
- Node.js 18.15
- Node.js 20.15
#### Node.js函数接口定义
**Node.js 6.10函数接口定义**
```
export.handler = function(event, context, callback)
```
- 入口函数名（handler）：入口函数名称， 需和函数执行入口处用户自定义的入口函数名称一致。
- 执行事件（event）：函数执行界面由用户输入的执行事件参数， 格式为JSON对象。
- 上下文环境（context）：Runtime提供的函数执行上下文，其接口定义在[SDK接口]说明。
- 回调函数（callback）：callback方法完整声明为callback(err, message)，用户通过此方法可以返回err和message至前台结果显示页面。具体的err或message内容需要用户自己定义，如字符串。
 
**Node.js 8.10及以后版本Runtime函数接口定义**
Node.js 8.10及以后版本Runtime除了兼容Node.js 6.10 Runtime函数的接口定义规范，还支持使用async的异步形式作为函数入口。通过return进行返回。
```
exports.handler = async (event, context, callback[可选]) => { return data;}
```
Node.js函数的函数执行入口参数格式为：**\[文件名\].\[函数名\]** ，请通过FunctionGraph控制台进行[函数执行入口](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0410.html#functiongraph_02_0410__fig15144125112717)配置。例如创建函数时设置函数执行入口为index.handler，那么FunctionGraph会去加载index.js中定义的handler函数。
#### Node.js的Initializer入口介绍
关于函数初始化入口Initializer的具体介绍请参考[函数初始化入口Initializer](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0532.html)。
Node.js的Initializer入口格式为：**\[** **文件名** **\].\[initializer** **名** **\]**
示例：实现initializer接口时指定的Initializer入口为"index.initializer"，那么函数工作流服务会去加载index.js中定义的initializer函数。
在函数工作流服务中使用Node.js编写initializer逻辑，需要定义一个Node.js函数作为initializer入口，以下为initializer的简单示例。
```
exports.initializer = function(context, callback) {
    callback(null, '');
    };
```
- 函数名 exports.initializer需要与实现initializer接口时的Initializer字段相对应。
  示例：创建函数时指定的Initializer入口为index.initializer，那么FunctionGraph会去加载index.js中定义的initializer函数。
  
- context参数 context参数中包含一些函数的运行时信息。例如：request id、临时AccessKey、function meta等。
  
- callback参数 callback参数用于返回调用函数的结果，其签名是function(err, data)，与Nodejs中惯用的callback一样，它的第一个参数是error，第二个参数data。如果调用时error不为空，则函数将返回HandledInitializationError，由于屏蔽了初始化函数的返回值，所以data中的数据是无效的，可以参考上文的示例设置为空。
  
 
#### Node.js Runtime集成的三方件
表1Node.js Runtime集成的三方件 
| 名称              | 功能                                                                                                                     | 版本号     |
|:---|:---|:---|
| q               | 异步方法封装。                                                                                                                | 1.5.1   |
| co              | 异步流程控制。                                                                                                                | 4.6.0   |
| lodash          | 常用工具方法库。                                                                                                               | 4.17.10 |
| esdk-obs-nodejs | OBS SDK。                                                                                                               | 2.1.5   |
| express         | 极简web开发框架。                                                                                                             | 4.16.4  |
| fgs-express     | 在FunctionGraph和API Gateway之上使用现有的Node.js应用程序框架运行无服务器应用程序和REST API 。提供的示例允许您使用Express框架轻松构建无服务器Web应用程序/服务和RESTful API 。 | 1.0.1   |
| request         | 简化HTTP调用，支持HTTPS并默认遵循重定向                                                                                               | 2.88.0  |
   
 #### SDK接口
Context类中提供了上下文方法供您在函数代码中使用，其声明和功能如[表2]所示。
 表2Context类上下文方法说明 
| 方法名                               | 方法说明                                                                                                                                                                                                                                                   |
|:---|:---|
| getRequestID()                    | 获取请求ID。                                                                                                                                                                                                                                                |
| getRemainingTimeInMilliSeconds () | 获取函数剩余运行时间。                                                                                                                                                                                                                                            |
| getAccessKey()                    | 获取用户委托的AccessKey（有效期24小时），使用该方法需要为函数配置委托。 **当前函数工作流已停止维护Runtime SDK 中getAccessKey接口，您将无法使用getAccessKey获取临时AK。**                                                                                               |
| getSecretKey()                    | 获取用户委托的SecretKey（有效期24小时），使用该方法需要为函数配置委托。 **当前函数工作流已停止维护Runtime SDK 中getSecretKey接口，您将无法使用getSecretKey获取临时SK。**                                                                                               |
| getSecurityAccessKey()            | 获取用户委托的SecurityAccessKey（有效期24小时），缓存时间为10分钟，即10分钟内再次获取的返回内容相同，使用该方法需要为函数配置委托。                                                                                                                                                                          |
| getSecuritySecretKey()            | 获取用户委托的SecuritySecretKey（有效期24小时），缓存时间为10分钟，即10分钟内再次获取的返回内容相同，使用该方法需要为函数配置委托。                                                                                                                                                                          |
| getSecurityToken()                | 获取用户委托的SecurityToken（有效期24小时），缓存时间为10分钟，即10分钟内再次获取的返回内容相同，使用该方法需要为函数配置委托。                                                                                                                                                                              |
| getUserData(string key)           | 通过key获取用户通过环境变量传入的值。                                                                                                                                                                                                                                   |
| getFunctionName()                 | 获取函数名称。                                                                                                                                                                                                                                                |
| getRunningTimeInSeconds ()        | 获取函数超时时间。                                                                                                                                                                                                                                              |
| getVersion()                      | 获取函数的版本。                                                                                                                                                                                                                                               |
| getMemorySize()                   | 分配的内存。                                                                                                                                                                                                                                                 |
| getCPUNumber()                    | 获取函数占用的CPU资源。                                                                                                                                                                                                                                          |
| getPackage()                      | 获取函数组。                                                                                                                                                                                                                                                 |
| getToken()                        | 获取用户委托的Token（有效期24小时），使用该方法需要为函数配置委托。                                                                                                                                                                                                                  |
| getLogger()                       | 获取context提供的logger方法，返回一个日志输出类，通过使用其info方法按"时间-请求ID-输出内容"的格式输出日志。 如调用info方法输出日志： logg = context.getLogger() logg.info("hello") |
| getAlias()                        | 获取函数的别名。                                                                                                                                                                                                                                               |
   
如[图1]所示，可在函数工作流控制台代码编辑器中使用context类。
图1使用context类   
![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002369435153.png)
#### 相关文档
- 使用Node.js开发事件函数，请参见[开发Node.js事件函数](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0410.html)。
- 使用Node.js运行时语言开发HTTP函数，请参见[使用Node.js开发HTTP函数](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0611.html)。
- 为Node.js函数制作依赖包，请参见[为Node.js函数制作依赖包](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0612.html)。
- 关于函数开发的更多说明，如函数支持的运行时、函数支持的触发事件、函数工程打包规范以及如何在函数中引入动态链接库，请参见[函数开发概述](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0100.html)。
 
