在 aws 代理集成 js lambda 中,是否有正确或标准的方法从 event.body 获取 html 表单值,而不仅仅是使用查询字符串?

Fat*_*tie 3 amazon-web-services node.js aws-lambda aws-api-gateway

有一个简单的 aws lambda(.mjs 文件)。有一个简单的 API 网关,使用代理集成。有一个简单的网络表单,

<form method="post" action="...">
<input type="text" name="team">
<input type="text" name="score">
<input type="submit" value="send">
Run Code Online (Sandbox Code Playgroud)

在您的 lambda 中,“事件”捕获从网关发送的整个信息块

export const handler = async (event, context) => {
   ...
Run Code Online (Sandbox Code Playgroud)

例如,您将在这里找到 queryStringParameters,

查询字符串参数:{示例:'值'},

标题在这里

headers: {
 accept: '*/*',
 ...
Run Code Online (Sandbox Code Playgroud)

等等。问题的实质内容被标记为“正文”

body: 'team=sec+west&score=42',
Run Code Online (Sandbox Code Playgroud)

实际例子!

在此输入图像描述

据我所知(似乎完全没有记录)html 表单参数作为 url 查询字符串样式的字符串传递。

因此,我总是这样简单地解析它们......

import querystring from 'querystring'
...
  if (event.body) {
    console.log('here is the "body" ...')
    console.log(event.body)
    let parsed = querystring.decode(event.body)
    team = parsed.team
Run Code Online (Sandbox Code Playgroud)

请注意,这个问题严格来说仅与使用代理集成网关有关。(当然,您不能使用代理集成,而是以您想要的任何方式映射它。)

另请注意,这是关于使用 html 表单。如果您将(例如)curl 与 -d '{ "team":"sec, "score":11 }'完全不同的表单一起使用,并且它以完全不同的方式交付(通过代理集成模式 api 网关)。

(另外,我不是在谈论多部分数据,只是一个普通的 html 表单。)

所以鉴于这event.body

body: 'team=sec+west&score=42',
Run Code Online (Sandbox Code Playgroud)

(正如屏幕截图所示)获取这些值的最佳方法到底是什么?

  • 对于如此普遍的任务,必须包含一个库(例如查询字符串)似乎很不寻常。aws 对 node/lambdas 的看法有很多“特殊”的东西,有什么特殊的方法吗?

  • 我对 Node/js 的理解可能很薄弱,我一直听说查询字符串已被弃用

  • 肯定有一种通常的标准惯用方式来完成这种最常见的事情吗?“获取 html 表单”

  • 正如我提到的,我真的不知道这是否url 查询字符串样式的字符串。它完全没有记录,而且在很多情况下,aws 使用的东西表面上看起来像其他东西,但实际上并非如此!

Che*_*yDT 6

它记录在此处(它说表单的默认 enctype 是,在此处application/x-www-form-urlencoded进一步解释),这就是 HTML 表单默认的工作方式,而不是特定于 AWS Lambda。AWS Lambda 只是按照浏览器发送原始正文的方式为您提供原始正文。

querystring已被弃用,取而代之的是该类URLSearchParams(从 Node v10 开始不需要外部库):

const params = new URLSearchParams(event.body)
console.log(params.get('team'))
Run Code Online (Sandbox Code Playgroud)