
# 使用华为云SDK开发Node.js函数示例
华为云[API Explorer](https://console.huaweicloud.com/apiexplorer/#/openapi/FunctionGraph/sdk?api=InvokeFunction)工具提供各云服务的API参考文档及配套SDK代码示例。
本章节以"获取函数列表"接口为例指导您使用华为云SDK，在函数工作流控制台开发Node.js函数。
 #### 步骤一：创建函数委托
1. 登录[统一身份认证服务（IAM）控制台](https://console.huaweicloud.com/iam/)。
2. 左侧导航栏选择"权限管理 \> 权限"，单击"创建自定义策略"。
3. 以配置"获取函数列表"接口的相关委托为例，如[图1]所示配置包含获取函数列表权限的自定义策略，单击"确定"完成自定义策略创建。
   关于权限的更多说明请参考[权限基本概念](https://support.huaweicloud.com/usermanual-iam/iam_01_0602.html)。
   图1获取函数列表自定义策略   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002518203563.png "点击放大")
   
   
4. 返回IAM控制台首页，在左侧导航栏选择"委托"，单击右上方的"创建委托"。
5. 配置委托参数，完成参数配置后如[图2]所示，单击"完成"，系统弹出"创建成功"提示，单击"立即授权"。
   图2填写基本信息   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002518365583.png "点击放大")
   
   
6. 在"选择策略"界面，选择[3]创建的自定义策略，单击"下一步"，其他参数请根据实际需求选择，完成委托授权。
 
 #### 步骤二：创建Node.js函数
1. 登录[函数工作流控制台](https://console.huaweicloud.com/functiongraph/?locale=zh-cn)，右上角单击"创建函数"。
2. 创建一个空白的Node.js事件函数，"委托"选择[步骤一：创建函数委托]中创建的委托，建议选择较新的运行时版本，单击"创建函数"进入函数详情页。
3. 在"代码"页签，下拉至"代码依赖包"模块，单击"添加依赖包"。
4. 如[图3]所示，"依赖包源"选择"私有依赖包"，单击"创建依赖包"进入依赖包创建界面。
   图3选择依赖包   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002412138697.png "点击放大")
   
   
5. 请参考[华为云Node.js SDK](https://console.huaweicloud.com/apiexplorer/#/sdkcenter/FunctionGraph?lang=NodeJs)和[创建函数依赖包](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_2119.html#section4)为函数创建所需的Node.js依赖包。
   请注意，创建Node.js依赖包时需选择与Node.js函数相同的运行时版本。
   
6. 完成依赖包创建后，回到[4]添加已创建的依赖包。
 
#### 步骤三：通过APIE获取SDK代码示例
1. 打开[API Explorer](https://console.huaweicloud.com/apiexplorer/#/openapi/FunctionGraph/sdk?api=InvokeFunction)，如[图4]所示选择所需的接口，单击"代码示例"页签，选择"Node.js"语言。
   
   图4APIE代码示例   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002411823309.png "点击放大")
   
   1. 此处以"获取函数列表"为例，单击选择接口。
   
   2. 填写接口所需的参数，参数描述可参考API参考手册中的相应章节，本例可参考[获取函数列表API](https://support.huaweicloud.com/api-functiongraph/functiongraph_06_0105.html)。
   
   3. 复制APIE生成的代码，粘贴在[步骤二：创建Node.js函数]创建好的函数的代码编辑框中。
   
   
   
   
2. 示例代码中的AK/SK信息建议[配置在函数的环境变量](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_0154.html)中，并在代码中使用context.getUserData(string key)方法获取。
   
   改写后的代码内容如下：
   ```
   const core = require('@huaweicloud/huaweicloud-sdk-core');
   const functiongraph = require("@huaweicloud/huaweicloud-sdk-functiongraph/v2/public-api");
   exports.handler = async (event, context) => {
       const ak = context.getUserData("AK");
       const sk = context.getUserData("SK");
       const endpoint = "https://functiongraph.cn-north-4.myhuaweicloud.com";
       const project_id = "project_id";
       const credentials = new core.BasicCredentials()
           .withAk(ak)
           .withSk(sk)
           .withProjectId(project_id)
       const client = functiongraph.FunctionGraphClient.newBuilder()
           .withCredential(credentials)
           .withEndpoint(endpoint)
           .build();
       const request = new functiongraph.ListFunctionsRequest();
       request.marker = "marker";
       request.maxitems = "maxitems";
       request.packageName = "package_name";
       request.funcName = "func_name";
       const result = client.listFunctions(request);
       result.then(result => {
           console.log("JSON.stringify(result)::" + JSON.stringify(result));
       }).catch(ex => {
           console.log("exception:" + JSON.stringify(ex));
       });
       const output =
       {
           'statusCode': 200,
           'headers':
           {
               'Content-Type': 'application/json'
           },
           'isBase64Encoded': false,
           'body': JSON.stringify(event),
       }
       return output;
   }
   ```
   
   
3. （可选）如需使用更安全的鉴权方式，可将以下代码内容替换： 
   ```
   const ak = context.getUserData("AK");
   const sk = context.getUserData("SK");
   const credentials = new core.BasicCredentials()
       .withAk(ak)
       .withSk(sk)
       .withProjectId(project_id)
   ```
   替换为：
   ```
   const ak = context.getSecurityAccessKey();
   const sk = context.getSecuritySecretKey();
   const st = context.getSecurityToken();
   const credentials = new core.BasicCredentials()
       .withAk(ak)
       .withSk(sk)
       .withProjectId(project_id)
       .with_security_token(st)
   ```
   
   
 
