如何使用 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.
中提取正文内容
{
"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'];
我正在向无服务器部署的 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.
中提取正文内容{
"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'];