Как исправить ошибку CORS при отправке формы с клиента в функцию шлюза API AWS? - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть форма контакта в моем приложении реагирования внешнего интерфейса, которую я хочу опубликовать в лямбда-функции, которая находится за шлюзом API, который, в свою очередь, имеет собственный домен поверх него.

Мой интерфейсработает на домене dev.example.com:3000 Мой API-шлюз включен на contact.example.com

Более того, я создал свою функцию Lambda без сервера и в своем файле YAML включил CORS следующим образом:

# serverless.yml

service: contact-form-api

custom:
  secrets: ${file(secrets.json)}

provider:
  name: aws
  runtime: nodejs8.10
  stage: ${self:custom.secrets.NODE_ENV}
  region: us-east-1
  environment: 
    NODE_ENV: ${self:custom.secrets.NODE_ENV}
    EMAIL: ${self:custom.secrets.EMAIL}
    DOMAIN: ${self:custom.secrets.DOMAIN}
  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "ses:SendEmail"
      Resource: "*"

functions:
  send:
    handler: handler.send
    events:
      - http:
          path: email/send
          method: post
          cors: true

Я использую AXIOS, чтобы сделать свой почтовый запрос, который происходит на стороне клиента:

const data = await axios.post(
    "https://contact.example.com/email/send",
    formData,
    {
        "Content-Type": "application/json",
    }
)

И ошибка, которую я получаю:

Доступ к XMLHttpRequest на 'https://contact.example.com/email/send' from origin 'http://dev.example.com:3000' заблокирован политикой CORS: заголовок' Access-Control-Allow-Origin 'содержит недопустимое значение' example.com '.

Я быЯ думал, что наличие внешнего интерфейса и API в одном домене позволит обойти любые ошибки cors (хотя я подделываю dev.example.com) локально для тестирования).Я также думаю, что настройка cors в моем файле YAML обойдется.

Кто-нибудь знает, почему я все еще получаю эту ошибку CORS?

Редактировать: Показ кода обработчика, который выполняется в функции Lambda// handler.js

const aws = require('aws-sdk')
const ses = new aws.SES()
const myEmail = process.env.EMAIL
const myDomain = process.env.DOMAIN

function generateResponse (code, payload) {
  return {
    statusCode: code,
    headers: {
      'Access-Control-Allow-Origin': "*",
      'Access-Control-Allow-Headers': 'x-requested-with',
      'Access-Control-Allow-Credentials': true
    },
    body: JSON.stringify(payload)
  }
}

function generateError (code, err) {
  console.log(err)
  return {
    statusCode: code,
    headers: {
      'Access-Control-Allow-Origin': "*",
      'Access-Control-Allow-Headers': 'x-requested-with',
      'Access-Control-Allow-Credentials': true
    },
    body: JSON.stringify(err.message)
  }
}

function generateEmailParams (body) {
  const { email, name, content } = JSON.parse(body)
  console.log(email, name, content)
  if (!(email && name && content)) {
    throw new Error('Missing parameters! Make sure to add parameters \'email\', \'name\', \'content\'.')
  }

  return {
    Source: myEmail,
    Destination: { ToAddresses: [myEmail] },
    ReplyToAddresses: [email],
    Message: {
      Body: {
        Text: {
          Charset: 'UTF-8',
          Data: `Message sent from email ${email} by ${name} \nContent: ${content}`
        }
      },
      Subject: {
        Charset: 'UTF-8',
        Data: `You received a message from ${myDomain}!`
      }
    }
  }
}

module.exports.send = async (event) => {
  try {
    const emailParams = generateEmailParams(event.body)
    const data = await ses.sendEmail(emailParams).promise()
    return generateResponse(200, data)
  } catch (err) {
    return generateError(500, err)
  }
}

1 Ответ

0 голосов
/ 20 декабря 2018

Вы должны добавить заголовок HTTP-запроса как «Content-type»:

enter image description here

Теперь перейдите к запросам интеграции и измените шаблон отображенияследующим образом:

enter image description here

Надеюсь, это поможет.и не забудьте развернуть API перед тестированием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...