在函数计算服务使用 Node.js 编程,需要定义一个 Node.js 函数作为入口。本文介绍了 Node.js HTTP 函数的结构和特点。为函数设置 HTTP 触发器后,HTTP 触发器通过发送 HTTP 请求触发函数执行,方便搭建 Web 应用。

HTTP 函数定义

一个简单的 Node.js HTTP 函数示例如下所示。

function(request, response, context)      
函数定义中包含以下几部分内容:

请求结构体 request

字段 类型 描述
headers map 类型 存放来自 HTTP 客户端的键值对。
path string 类型 表示 HTTP 路径。
queries map 类型 存放来自 HTTP 路径中的查询部分的键值对,值的类型可以为字符串或数组。
method string 类型 表示 HTTP 方法。
clientIP string 类型 客户端的 IP 地址。
url string 类型 请求的地址。

此外,HTTP 函数中的请求兼容 HTTP 请求,没有提供额外的 body 字段,需要使用 HTTP 请求获取 body

// 详见示例
var getRawBody = require('raw-body')
getRawBody(request, function(err, data){
      var body = data
})            
说明

Headers Key 中包含以下字段会被忽略,不支持用户自定义。同时以 x-fc- 开头的 Key 也会被忽略。

  • accept-encoding
  • connection
  • keep-alive
  • proxy-authorization
  • te
  • trailer
  • transfer-encoding

响应 response 提供的方法

  • response.setStatusCode(statusCode) : 设置状态码。
    • param statusCode : (required, type integer)。
  • response.setHeader(headerKey, headerValue) :设置响应头。
    • paramheaderKey : (required, type string)。
    • paramheaderValue : (required, type string)。
  • response.deleteHeader(headerKey) :删除响应头。
    • paramheaderKey: (required, type string)。
  • response.send(body): 发送响应体。
    • parambody: (required, typeBuffer or a string or a stream.Readable )。
说明

Headers Key 中包含以下字段会被忽略,不支持用户自定义。同时以 x-fc- 开头的 Key 也会被忽略。

  • connection
  • content-length
  • content-encoding
  • date
  • keep-alive
  • proxy-authenticate
  • server
  • trailer
  • transfer-encoding
  • upgrade

限制说明

  • 请求限制

    如果超过以下限制,会返回 400 状态码和 InvalidArgument 错误码。

    字段 限制说明 HTTP 状态码 错误码
    headers 请求头中的所有键和值的总大小不能超过 4 KB。 400 InvalidArgument
    path 请求路径以及所有查询参数的总大小不能超过 4 KB。
    body HTTP body 的总大小不能超过 6 MB。
  • 响应限制

    如果超过以下限制,会返回 502 状态码和 BadResponse 错误码。

    字段 限制说明 HTTP 状态码 错误码
    headers 响应头中的所有键和值对的大小不能超过 4 KB。 502 BadResponse
    body HTTP body 的大小不能超过 6 MB。

示例

以下示例代码中展示了如何在函数中获取请求的详细信息。

var getRawBody = require('raw-body')
module.exports.handler = function (request, response, context) {
    // get requset header
    var reqHeader = request.headers
    var headerStr = ' '
    for (var key in reqHeader) {
        headerStr += key + ':' + reqHeader[key] + '  '
    };

    // get request info
    var url = request.url
    var path = request.path
    var queries = request.queries
    var queryStr = ''
    for (var param in queries) {
        queryStr += param + "=" + queries[param] + '  '
    };
    var method = request.method
    var clientIP = request.clientIP

    // get request body
    getRawBody(request, function (err, data) {
        var body = data
        // you can deal with your own logic here

        // set response
        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')
        response.setStatusCode(200)
        response.setHeader('content-type', 'application/json')
        response.send(respBody)
    })
};
			

更多信息