У меня есть форма контакта в моем приложении реагирования внешнего интерфейса, которую я хочу опубликовать в лямбда-функции, которая находится за шлюзом 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)
}
}