
# 使用Node.js开发HTTP函数
本章节以通过HTTP函数部署Koa框架为例，指导您使用Node环境开始开发函数。
#### 约束与限制
- HTTP函数只能绑定APIG/APIC触发器，根据函数和APIG/APIC之间的转发协议。 **函数的返回合法的http响应报文中必须包含body(String)、statusCode(int)、headers(Map)和isBase64Encoded(boolean)，HTTP函数会默认对返回结果做Base64编码，isBase64Encoded默认为true，其它框架同理。**
  
- HTTP函数默认开放端口为8000。
- 通过APIG服务调用函数服务时，即使用APIG触发器时，isBase64Encoded的值默认为true，表示APIG传递给FunctionGraph的请求体body已经进行Base64编码，需要先对body内容Base64解码后再处理。
  函数必须按以下结构返回字符串。
  ```
  {
      "isBase64Encoded": true|false,
      "statusCode": httpStatusCode,
      "headers": {"headerName":"headerValue",...},
      "body": "..."
  }
  ```
  
 
#### 前提条件
已在本地操作系统中安装Node环境。推荐使用[EulerOS环境](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0612.html#functiongraph_02_0612__section109813741417)进行Node.js的依赖包制作。
#### 使用HTTP函数部署Koa框架示例
Koa框架是一个基于Node.js的Web开发框架，主要用于构建高效、可扩展的Web应用。
1. 执行以下命令创建项目文件夹。
   ```
   mkdir koa-example && cd koa-example
   ```
   
2. 执行以下命令初始化nodejs项目和下载koa框架。
   ```
   npm init -y
   npm i koa
   ```
   执行成功后，文件夹中会新增node_modules文件夹和package.json、package-lock.json文件。
   
3. 创建index.js文件，在index.js文件中引入Koa框架，Koa框架的更多使用方法可参考[Koa指南](https://www.koajs.com.cn/)。
   代码示例：
   ```
   const Koa = require("koa");
   const app = new Koa();
   const main = (ctx) =>{
       if (ctx.request.path == ("/koa")) {
           ctx.response.type = "application/json";
           ctx.response.body = "Hello World, user!";
           ctx.response.status = 200;
       } else {
           ctx.response.type = "application/json";
           ctx.response.body = 'Hello World!';
           ctx.response.status = 200;
       }
   };
   app.use(main);
   app.listen(8000, '127.0.0.1');
   console.log('Node.js web server at port 8000 is running.')
   ```
   
4. 准备一个bootstrap启动文件，作为HTTP函数的启动文件。文件内容如下：
   ```
   /opt/function/runtime/nodejs20.15/rtsp/nodejs/bin/node $RUNTIME_CODE_ROOT/index.js
   ```
   - /opt/function/runtime/nodejs20.15/rtsp/nodejs/bin/node：表示nodejs编译环境所在路径。
   
   - $RUNTIME_CODE_ROOT：系统变量，表示容器中项目代码存放路径/opt/function/code。
   
   - index.js：[3]创建的项目入口文件，可自定义名称。
   
   
   目前支持的Nodejs语言和对应的路径请参见[表1]。
    表1Nodejs语言对应路径 
   | 语言         | 路径                                                     |
   |:---|:---|
   | Node.js 6  | /opt/function/runtime/nodejs6.10/rtsp/nodejs/bin/node  |
   | Node.js 8  | /opt/function/runtime/nodejs8.10/rtsp/nodejs/bin/node  |
   | Node.js 10 | /opt/function/runtime/nodejs10.16/rtsp/nodejs/bin/node |
   | Node.js 12 | /opt/function/runtime/nodejs12.13/rtsp/nodejs/bin/node |
   | Node.js 14 | /opt/function/runtime/nodejs14.18/rtsp/nodejs/bin/node |
   | Node.js 16 | /opt/function/runtime/nodejs16.17/rtsp/nodejs/bin/node |
   | Node.js 18 | /opt/function/runtime/nodejs18.15/rtsp/nodejs/bin/node |
   | Node.js 20 | /opt/function/runtime/nodejs20.15/rtsp/nodejs/bin/node |
      
   
5. 把所有项目文件和bootstrap文件打包成Zip文件。打包时需注意确保解压后，项目入口文件位于根目录。
   图1打包所有文件   
   ![](https://support.huaweicloud.com/devg-functiongraph/zh-cn_image_0000002262929973.jpg "点击放大") 
6. 登录[函数工作流控制台](https://console.huaweicloud.com/functiongraph/?locale=zh-cn)，右上角单击"创建函数"
7. 创建一个空白HTTP函数，并将上述Zip文件上传至"代码"页签。 创建成功后即可使用Koa框架自行开发应用，框架提供了处理请求的基础设施，您自定义的应用代码则定义具体的业务逻辑。
   
 
#### 相关文档
- 关于Node.js函数开发的更多说明，请参见[Node.js函数开发概述](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0501.html)。
- 使用Node.js开发事件函数，请参见[开发Node.js事件函数](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0410.html)。
- 制作Node.js运行时的函数依赖包，请参见[为Node.js函数制作依赖包](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0612.html)。
- 关于HTTP函数的更多介绍，请参见[创建HTTP函数](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_1441.html)。
- 关于函数开发的更多说明，如函数支持的运行时、函数支持的触发事件、函数工程打包规范以及如何在函数中引入动态链接库，请参见[函数开发概述](https://support.huaweicloud.com/devg-functiongraph/functiongraph_02_0100.html)。
 
