Распределение ресурсов между источниками в интеграции AWS лямбда-прокси - PullRequest
1 голос
/ 21 февраля 2020

Просматривал SO в течение последних часов, чтобы найти решение для моей проблемы, но пока нет прогресса, я получаю

Нет заголовка 'Access-Control-Allow-Origin' отсутствует на запрошенном ресурсе.

Теперь обычно это можно исправить, добавив в код соответствующие заголовки, и это будет работать, однако это не так, поскольку я пытался настроить cors через API-шлюз на AWS.

Снимок экрана: AWS CORS

В некоторых исследованиях Google упоминается, что если функция использует интеграцию лямбда-прокси, мы бы изменить саму лямбду и добавить собственные заголовки, например,

 headers: {
    'Access-Control-Allow-Origin': '*',
  },

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

Мой настоящий код для лямбды (забыл добавить):

const rp = require('request-promise')
const sendEmail = require('./sendEmail')

module.exports.run = async (event, context, callback) => {
  const body = JSON.parse(event.body)
  const { name, email, budget, message, attachment } = body

  if (!name) {
    return callback(null, {
      statusCode: 400,
      body: JSON.stringify({ message: 'Name is required' }),
    })
  }

  if (!email) {
    return callback(null, {
      statusCode: 400,
      body: JSON.stringify({ message: 'Email address is required' }),
    })
  }

  if (!message) {
    return callback(null, {
      statusCode: 400,
      body: JSON.stringify({ message: 'Message is required' }),
    })
  }

  return Promise.all([
    sendEmail({
      to: 'Example <user@example.com>',
      subject: 'New enquiry received!',
      data:
        `Name: ${name}\n` +
        `Email: ${email}\n` +
        `Budget: ${budget || 'n/a'}\n` +
        `Attachment: ${attachment || 'n/a'}\n` +
        `\n${message}`,
    }),
    sendEmail({
      to: `${name} <${email}>`,
      subject: 'Your message was delivered at ',
      data:
        'Thanks for reaching out!\n' +
        'Somebody at our office will get back to you as soon as possible.\n' +
        '\n' +
        'While you wait, check out our Handbook (/) and get acquainted with how we do things around here.\n' +
        'We have a lot of content there so feel free to explore as you please.\n' +
        '\n' +
        'Speak soon,\n' +
        '\n',
    }),
    rp({
      method: 'POST',
      uri: `https://hooks.slack.com/services/${process.env.SLACK_PATH}`,
      json: true,
      body: {
        text: `<!channel> New enquiry received`,
        attachments: [
          {
            fallback: 'Information:',
            pretext: 'Information:',
            color: '#FF5050',
            fields: [
              { title: 'Name', value: name, short: false },
              { title: 'Email', value: email, short: false },
              { title: 'Budget', value: budget || 'n/a', short: false },
              { title: 'Attachment', value: attachment || 'n/a', short: false },
              { title: 'Message', value: message || 'n/a', short: false },
            ],
          },
        ],
      },
    }),
  ])
    .then(() => {
      return callback(null, {
        statusCode: 200,
       headers: {
        'Access-Control-Allow-Origin': '*',
      },
        body: JSON.stringify({ message: 'Great success' }),
      })
    })
    .catch(err => {
      return callback(null, {
        statusCode: 500,
        body: JSON.stringify({
          message: 'Oh no :( Message not delivered',
          error: err
        }),
      })
    })
}

1 Ответ

1 голос
/ 21 февраля 2020

На запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».

Это говорит о том, что запрошенный вами ресурс, ваш Lambda через API-шлюз, не является возвращая заголовок Access-Control-Allow-Origin в своем ответе; браузер ожидает заголовки CORS в ответе от API (возможно, из-за запроса OPTIONS), но у ответа их нет.

Чтобы решить вашу проблему, добавьте заголовок Access-Control-Allow-Origin: * в ответ ваш лямбда возвращается. Используя первый возвращаемый элемент:

if (!name) {
    return callback(null, {
      statusCode: 400,
      headers: {
            'Access-Control-Allow-Origin': '*',
            // any other required headers
        },
      body: JSON.stringify({ message: 'Name is required' }),
    })
}

Стоит отметить, что вам придется добавлять эти заголовки к каждому ответу.

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