reactjs - 如何向此 Lambda 函数添加 CORS 标头
问题描述
请告诉我,因为这是我的第一个堆栈溢出帖子,但我的后端经验很少,并且很难满足 CORS 要求。
我想使用 AWS(SES、API Gateway、Lambda)将表单数据发送到我们公司的电子邮件帐户。我的功能目前在 AWS 中测试时有效,但在我网站的客户端上不起作用。根据我迄今为止从研究中收集到的信息,我的 Lambda 函数需要一个 CORS 标头才能工作。这是代码:
var aws = require("aws-sdk");
var ses = new aws.SES({ region: "us-east-1" });
exports.handler = async function(payload) {
var params = {
Destination: {
ToAddresses: ['placeholder@place.com'],
},
Message: {
Body: {
Text: {
Data: `\n
${payload.fullName} has tried to contact you. \n
Message: \n
-------------------- \n
${payload.comments} \n
-------------------- \n
Here is the sender's contact information: \n
Name: ${payload.fullName} \n
Email: ${payload.emailAddress} \n
Phone: ${payload.phone} \n
Company: ${payload.companyName}`
},
},
Subject: { Data: payload.subject },
},
Source: 'placeholder@place.com',
};
return ses.sendEmail(params).promise()
};
我正在查看此代码作为如何包含 CORS 标头的示例:
exports.handler = async (event) => {
let data = {};
let res = {
statusCode: 200,
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*' // replace with hostname of frontend (CloudFront)
},
body: JSON.stringify(data)
};
return res;
};
谁能帮我结合这两种方法?我不明白如何将 SES 功能变成更传统的响应。我主要是前端开发人员,所以我希望我错过了一些愚蠢的东西。我很感激任何回应。
解决方案
如果您可以将 API Gateway 集成类型更改为Lambda 代理,那么此代码可以帮助您。
将处理程序方法中的整个代码移动到另一个函数说sendEmail
const sendEmail = async function(payload) {
// Your code to crete the `params` omitted for brevity
return ses.sendEmail(params).promise()
};
处理程序可以调用此函数并根据此函数的结果发送带有 CORS 标头的适当结果
exports.handler = async function(event) {
const payload = JSON.parse(event.body);
const CORS_HEADERS = {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*' // Your origin name
};
try {
await sendEmail(payload);
return {
statusCode: 200,
headers: CORS_HEADERS,
body: '{}'
}
} catch(err) {
return {
statusCode: 500, // Can be 4XX or 5XX depending on the error
headers: CORS_HEADERS,
body: `{"err": ${err.messge}}`
}
}
}
为了使CORS请求能够正常工作,您还需要确保OPTIONS
请求以适当的标头响应。您可以按照本文档使用 AWS 控制台执行此操作。对于 CloudFormation 和 api-gateway V2,此文档应该会有所帮助。对于 AWS SAM,此文档应该会有所帮助(如果您尚未使用任何无服务器开发工具,请查看 AWS SAM)。
如果您不想使用 Lambda 代理,请确保集成响应为 OPTIONS 请求和 POST 请求发送适当的 CORS 标头。这可以提供帮助。
推荐阅读
- php - 代码重构 - 改进重复查询生成器调用以提高可读性
- r - 我在 R 上有 2 个图表。它们有不同的 x 轴,但趋势图相似。我如何将它们覆盖在 r 上?
- java - 使用 Java 从 Google 请求 OAUTH 的 JWT 签名无效
- javascript - React.js 奇怪的行为
- r - 反向术语文档的组变量
- javascript - TypeORM 中的 FILTER 语句
- javascript - ASP.Net 验证器成功时如何调用 JavaScript 函数?
- python - python学习tkinter listbox catch no selection错误
- java - 服务器突然发送 Fin Push Ack
- java - 如何在带有 MangoDB 的 Spring Boot 中使用聚合和标准获取包含字段计数的数据列表