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

HTTP函数定义

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

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

请求结构体Request

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

此外,HTTP函数中的请求兼容HTTP请求,没有提供额外的body字段,需要使用HTTP请求获取body。详情请参见Node.js

// 详见示例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)
    })
};            

更多信息