全部产品
云市场

Node.js HTTP 函数

更新时间:2020-03-24 10:51:36

在函数计算服务使用 Node.js 编程,需要定义一个函数作为入口函数。

本文介绍了 Node.js HTTP 函数,为函数设置 HTTP 触发器后,可以直接处理发来的 HTTP 请求,方便搭建 Web 应用。

基本结构

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

  1. function(request, response, context)

其中的 context 参数与事件函数接口的 context 接口相同。

请求结构体 request

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

获取 HTTP body:HTTP 函数中的请求兼容 HTTP 请求,没有提供额外的 body 字段,直接使用 HTTP 请求获取 body

  1. // 详见示例
  2. var getRawBody = require('raw-body')
  3. getRawBody(request, function(err, data){
  4. var body = data
  5. })

说明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。

示例

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

  1. var getRawBody = require('raw-body')
  2. module.exports.handler = function (request, response, context) {
  3. // get requset header
  4. var reqHeader = request.headers
  5. var headerStr = ' '
  6. for (var key in reqHeader) {
  7. headerStr += key + ':' + reqHeader[key] + ' '
  8. };
  9. // get request info
  10. var url = request.url
  11. var path = request.path
  12. var queries = request.queries
  13. var queryStr = ''
  14. for (var param in queries) {
  15. queryStr += param + "=" + queries[param] + ' '
  16. };
  17. var method = request.method
  18. var clientIP = request.clientIP
  19. // get request body
  20. getRawBody(request, function (err, data) {
  21. var body = data
  22. // you can deal with your own logic here
  23. // set response
  24. 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')
  25. response.setStatusCode(200)
  26. response.setHeader('content-type', 'application/json')
  27. response.send(respBody)
  28. })
  29. };

更多信息

Node.js 运行环境的详细信息,请参见 Node.js 运行环境

您在使用中遇到任何问题,请联系我们