代码开发

本文介绍使用云函数编写代码的相关基础概念,包括请求处理函数、函数实例生命周期回调方法等。

请求处理程序

MemFire Cloud云函数的请求处理程序,是函数代码中处理请求的方法。当您的云函数被调用时,会运行您提供的Handler方法处理请求。对于Node.js语言的云函数而言,函数入口为 [文件名].[函数名],默认为index.handler;

您可以使用HTTP请求处理程序更方便地处理HTTP请求。当调用函数时,MemFire Cloud云函数使用您提供的执行方法来处理HTTP请求。

HTTP Handler签名#

Node.js的HTTP Handler的签名如下。您只需实现一个函数,就能响应HTTP请求。

1exports.handler = (req, resp, context) => {
2    console.log("receive body: ", req.body.toString());
3    resp.setHeader("Content-Type", "text/plain");
4    resp.send('<h1>Hello, world!</h1>');
5}

示例解析如下:

  • handler:HTTP Handler名称。
  • req:HTTP请求结构体。
  • resp:HTTP返回结构体。
  • context:上下文信息。

HTTP请求结构体#

字段类型描述
headersObject存放来自HTTP客户端的键值对。
pathString表示HTTP路径。
queriesObject存放来自HTTP路径中的查询部分的键值对,值的类型可以为字符串或数组。
methodString表示HTTP方法。
clientIPString客户端的IP地址。
urlString请求的地址。

说明 Headers键值对中的key中包含以下字段或以x-fc-开头的key均会被忽略,因此,不支持自定义。

  • connection
  • keep-alive

HTTP响应结构体#

字段类型描述
response.setStatusCode(statusCode)interger设置状态码。
response.setHeader(headerKey, headerValue)String,String设置响应头。
response.deleteHeader(headerKey)String删除响应头。
response.send(body)Buffer,String,Stream.Readable发送响应体。

重要

headerKey中包含以下字段或以x-fc-开头的headerKey均会被忽略,因此,不支持自定义。

  • connection
  • content-length
  • date
  • keep-alive
  • server
  • upgrade

限制说明

  • 请求限制
  • 如果超过以下限制,会返回400状态码和InvalidArgument错误码。
字段限制说明HTTP状态码错误码
headers请求头中的所有键和值的总大小不能超过4 KB。400InvalidArgument
path请求路径以及所有查询参数的总大小不能超过4 KB。
body同步调用请求的Body的总大小不能超过16 MB,异步调用请求的Body的总大小不能超过128 KB。
  • 响应限制
  • 如果超过以下限制,会返回502状态码和BadResponse错误码。
字段限制说明HTTP状态码错误码
headers响应头中的所有键和值对的大小不能超过4 KB。502BadResponse

示例:获取HTTP请求详细信息并返回Body#

示例代码

1module.exports.handler = function (request, response, context) {
2    // get requset headervar reqHeader = request.headers
3    var headerStr = ' 'for (var key in reqHeader) {
4        headerStr += key + ':' + reqHeader[key] + '  '
5    };
6
7    // get request infovar url = request.url
8    var path = request.path
9    var queries = request.queries
10    var queryStr = ''for (var param in queries) {
11        queryStr += param + "=" + queries[param] + '  '
12    };
13    var method = request.method
14    var clientIP = request.clientIP
15    var body = request.body
16    var respBody = new Buffer('requestHeader:' + headerStr + '\n' + 'url: ' + url + '\n' + 'path: ' + path + '\n' + 'queries: ' + queryStr + '\n' + 'method: ' + method + '\n' + 'clientIP: ' + clientIP + '\n' + 'body: ' + body + '\n')
17    response.setStatusCode(200)
18    response.setHeader('content-type', 'application/json')
19    response.send(respBody)
20};

函数实例生命周期回调方法

MemFire Cloud云函数支持Initializer生命周期回调方法。

Initializer回调#

您可以将数据库场景下连接池构建、函数依赖库加载等耗时较长的业务逻辑放到Initializer回调中,避免每次运行函数都会做重复的操作,降低函数延时。

初始化回调程序(Initializer回调)在函数实例启动成功之后,运行请求处理程序(Handler)之前执行。函数计算保证在一个实例生命周期内,成功且最多成功执行一次Initializer回调。例如,您的Initializer回调第一次执行失败后系统会重试,直到成功为止,然后再执行您的请求处理程序。

Initializer回调只有一个context输入参数,使用方法和事件请求处理程序一样。

一个最简单的Initializer回调如下所示。

1exports.initialize = function(context, callback) {
2  console.log('initializer');
3  callback(null, "");
4};

MemFire Cloud平台默认的Initializer 回调程序index.initialize,那么云函数在配置Initializer属性后会去加载index.js中定义的initialize方法。

方法签名

  • 输入参数只有context,为您的云函数调用提供在调用时的运行上下文信息。
  • 无返回值。

函数调用说明

  • 前提:当用户想通过路由传输类似于/a/b这样的path信息时,那么我们建议使用查询参数(query parameter)来实现这一目的。
  • 使用:在该场景下,用户应该将路径信息改为/a,并在该路径后添加查询参数?action=b,以便服务器可以正确地解析和处理请求。