如何使用 Lambda 读取无服务器应用程序中的 POST 参数?

How to read the POST parameters in a serverless application with Lambda?

我正在向无服务器部署的 Lambda 函数提交表单,这是 yml:

functions:
  hello:
    handler: handler.hello
    events:
      - http: POST hello

现在我的问候函数是:

module.exports.hello = (event, context, callback) => {
  const response = {
    statusCode: 200,
    body: JSON.stringify({
      message: 'Go Se222rverless v1.0! Your function executed successfully!',
      input: event,
    }),
  };

  callback(null, response);
};

我可以在输出中看到变量已传递,但它们存储在 event.body 属性 中:

 "body":"email=test%40test.com&password=test12345"

现在我可以访问这个字符串,但我无法从中读取单个变量,除非我进行一些正则表达式转换,我相信在这样的现代堆栈中不会出现这种情况,例如 serverless/aws.

我错过了什么?如何读取各个变量?

您可以使用节点 querystring 模块来解析 POST 正文。

各种编程模型的处理程序文档暗示来自 API 网关的事件类型是低级流。这意味着您必须使用其他方法从 POST.

中提取正文内容

Input Format

{
    "resource": "Resource path",
    "path": "Path parameter",
    "httpMethod": "Incoming request's method name"
    "headers": {Incoming request headers}
    "queryStringParameters": {query string parameters }
    "pathParameters":  {path parameters}
    "stageVariables": {Applicable stage variables}
    "requestContext": {Request context, including authorizer-returned key-value pairs}
    "body": "A JSON string of the request payload."
    "isBase64Encoded": "A boolean flag to indicate if the applicable request payload is Base64-encode"
}

网络 Only the System.IO.Stream type is supported as an input parameter by default.

Python event - 该参数通常为Python dict类型。也可以是list、str、int、float或NoneType类型。

您的无服务器端点似乎正在使用 Content-Type: application/x-www-form-urlencoded 接收数据。您可以更新请求以使用 JSON 数据来访问 post 变量,就像访问其他 JavaScript 对象一样。

假设这不是一个选项;您仍然可以使用节点查询字符串模块来访问您的 post 主体数据以解析请求的主体,这是一个示例:

const querystring = require('querystring');

module.exports.hello = (event, context, callback) => {

  // Parse the post body
  const data = querystring.parse(event.body);

  // Access variables from body
  const email = data.email;

  ...

}

请记住,如果 post 正文中的某些参数使用了无效的名称 JavaScript 对象标识符,请使用方括号表示法,例如:

const rawMessage = data['raw-message'];