首页 > 解决方案 > 如何向此 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 功能变成更传统的响应。我主要是前端开发人员,所以我希望我错过了一些愚蠢的东西。我很感激任何回应。

标签: reactjsamazon-web-servicesaws-lambda

解决方案


如果您可以将 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 标头。可以提供帮助。


推荐阅读