
# NodeJS语言方案
#### 前提条件
- 已拥有华为云账号且已实名认证。
- 华为云账号未欠费，且有足够金额购买本案例所涉及的资源。
 
#### 操作步骤
1. 创建函数 
   1. 登录[函数工作流控制台](https://console.huaweicloud.com/functiongraph/)，在左侧导航栏选择"函数 \> 函数列表"，单击"创建函数"。
   
   2. 选择"创建空白函数"，填写函数信息，完成后单击"创建函数"。
      - 函数类型：事件函数。
      
      - 区域：华北-北京四。
      
      - 函数名称：输入您自定义的函数名称，此处以"upload-file-1"为例。
      
      - 委托名称：未使用任何委托。
      
      - 运行时：Node.js 14.18。
       
   
   3. 在"代码"页签，复制如下代码替换默认的函数代码，并单击"部署"更新函数。
      ```
      const stream = require("stream");
      const Busboy = require("busboy");
      exports.handler = async (event, context) => {
          const logger = context.getLogger()
          logger.info("Function start run.");
          if (!("content-type" in event.headers) ||
              !event.headers["content-type"].includes("multipart/form-data")) {
              return {
                  'statusCode': 200,
                  'headers': {
                      'Content-Type': 'application/json'
                  },
                  'body': 'The request is not in multipart/form-data format.',
              };
          }
          const busboy = Busboy({ headers: event.headers });
          let buf = Buffer.alloc(0);
          busboy.on('file', function (fieldname, file, filename, encoding, mimetype) {
              logger.info('filename:' + JSON.stringify(filename))
              file.on('data', function (data) {
                  logger.info('Obtains ' + data.length + ' bytes of data.')
                  buf = Buffer.concat([buf, data]);
              });
              file.on('end', function () {
                  logger.info('End data reception');
              });
          });
          busboy.on('finish', function () {
              //这里处理数据
              logger.info(buf.toString());
              return {
                  'statusCode': 200,
                  'headers': {
                      'Content-Type': 'application/json'
                  },
                  'body': 'ok',
              };
          });
          //APIG触发器默认对数据进行Base64编码，这里解码
          const body = Buffer.from(event.body, "base64");
          var bodyStream = new stream.PassThrough();
          bodyStream.end(body);
          bodyStream.pipe(busboy);
      }
      ```
      
   
   
   
   
2. 配置函数依赖 
   1. 制作依赖包。代码中选择busboy库解析上传的文件，需要生成Node.js14.18版本对应的依赖包busboy.zip。如果您使用Node.js语言其他版本，请制作对应版本的依赖包，具体请参考[制作依赖包](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0612.html)。
   
   2. 创建依赖包。在左侧导航栏"函数 \> 依赖包"管理页面，单击"创建依赖包"，配置完成后单击"确定"。
      - 依赖包名称：输入您自定义的依赖包名称，例如"busboy"。
      
      - 代码上传方式：上传ZIP文件。
      
      - 运行时：Node.js 14.18。
      
      - 文件上传：添加制作完成的依赖包。
       
   
   3. 添加依赖包。进入upload-file-1函数详情页面，在"代码"页签最底部，单击"添加依赖包"。在"私有依赖包"的包源中，选择上一步创建的busboy依赖包，单击"确定"，完成依赖包的添加。
   
   
   
   
3. 配置APIG触发器 
   1. 在upload-file-1函数详情页面，单击"设置 \> 触发器"，开始创建触发器。
   
   2. 单击"创建触发器"，触发器类型选择"API 网关服务(APIG 专享版)"。
      - 实例：选择API实例，若无可用实例，可单击"创建实例"进入创建页面。
      
      - API名称：默认即可，无需修改。
      
      - 分组：选择在APIG创建的API分组，若无分组，可单击"创建分组"跳转至APIG创建。
      
      - 发布环境：RELEASE。
      
      - 安全认证：此处为方便测试，配置"None"，实际业务请选择更安全的认证方式。
      
      - 请求协议：选择"HTTPS"。
      
      - 请求方法：选择"ANY"。
      
      - 后端超时（毫秒）：默认5000毫秒。
       
   
   
   
   
4. 端到端测试 
   以curl工具为例（curl -F的方式主要用的是linux环境），您也可以选择postman等其他工具，在本地创建app.log文件，内容自定义，此处简单举例：
   ```
   start something
   run
   stop all
   ```
   执行如下命令测试：
   ```
   curl -iv {APIG触发器URL} -F upload=@/{本地文件路径}/app.log
   ```
   图1示例   
   ![](https://support.huaweicloud.com/bestpractice-functiongraph/zh-cn_image_0000002129944202.png "点击放大")
   在upload-file-1函数详情页面的"监控"页签下，查看日志，可看到文件内容的打印。实际业务中，用户可根据需要修改代码保存数据到对象存储OBS、日志服务LTS等云服务或直接处理。
   
   
 
