全通配符配置下Lambda触发CORS预检失败及数据读取异常问题
问题:JavaScript+Lambda+SES联系表单HTTP调用失败,控制台测试正常
问题现象
- Lambda控制台测试时邮件发送正常,但前端通过HTTP调用时失败
- 浏览器控制台报CORS相关错误
- CloudWatch日志显示
KeyError: 'name';改用event.get()方法后CORS错误消失、邮件可生成,但所有字段值均为None,且日志显示请求数据已正常传输
浏览器错误信息
控制台提示跨域资源共享请求被阻止
Lambda函数代码(初始版本)
import boto3 import json ses = boto3.client('ses') def lambda_handler(event, context): name = event['name'] email = event['email'] phone_number = event['phone_number'] message = event['message'] # 构造邮件内容 subject = f"New message from {name}" body = f"From: {name}\nEmail: {email}\nPhone: {phone_number}\nMessage: {message}" sender = 'myemail@somedomain.com' recipient = 'myemail@somedomain.com' # 调用SES发送邮件 response = ses.send_email( Source=sender, Destination={ 'ToAddresses': [ recipient, ] }, Message={ 'Subject': { 'Data': subject, 'Charset': 'UTF-8' }, 'Body': { 'Text': { 'Data': body, 'Charset': 'UTF-8' } } } ) return { 'statusCode': 200, 'headers': { 'Access-Control-Allow-Headers': '*', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': '*' }, 'body': json.dumps('Email sent successfully!') }
前端JavaScript代码
const formEl = document.querySelector(".contact_form"); formEl.addEventListener('submit', event => { event.preventDefault() const formData = new FormData(formEl); const data = Object.fromEntries(formData); fetch('https://myapigatewayuri/prod/contact-form', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }) .then( response => { console.log('Here is the response:') console.log(response); if (response.status === 200) { formEl.reset(); window.alert("Your message was sent successfully. Thank you for reaching out!") } else if (response.status !== 200) { window.alert("There was a problem sending your message.") } }) });
请求数据示例
{ "name": "test name", "phone_number": "12345678", "email": "test@test.com", "message": "test message" }
CloudWatch日志信息
初始版本错误日志
{ "errorMessage": "'name'", "errorType": "KeyError", "stackTrace": [ " File \"/var/task/lambda_function.py\", line 16, in lambda_handler\n name = event['name']\n" ] }
修改为event.get()后的日志(请求数据正常)
(e5f7444e-a6a5-4b8f-8f47-8f586a342a4a) Method request body before transformations: {
"name": "test name",
"phone_number": "12345678",
"email": "test@test.com",
"message": "test message"
}
已尝试的操作
- 将Lambda中变量赋值从
event['key']改为event.get('key'),CORS错误消失但字段值全为None
内容的提问来源于stack exchange,提问作者codenoob
相关产品推荐
相关产品推荐

