Почему я получаю ошибку CORS при запросе GET к API-шлюзу, когда запрос OPTIONS имеет статусCode 200? - PullRequest
2 голосов
/ 12 марта 2019

Я пытаюсь сделать GET HTTP-запрос к конечной точке шлюза AWS API, подключенной к лямбда-функции.

Конечная точка и лямбда-функция работают как обычно, когда тестируются с почтальоном, что логично, поскольку почтальон не работаетиспользуйте CORS.

Однако при тестировании Firefox на Chrome я получаю следующую ошибку:

Firefox:

Блокировка перекрестного запроса: тот же источникПолитика запрещает чтение удаленного ресурса по адресу [ url ] (причина: отсутствует заголовок CORS 'Access-Control-Allow-Origin').

Chrome:

Доступ к выборке по [ url ] из источника 'http://localhost:8080' заблокирован политикой CORS: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».Если непрозрачный ответ удовлетворяет вашим потребностям, установите режим запроса «no-cors», чтобы получить ресурс с отключенным CORS.

Но, если я посмотрю на ответ на запрос предварительной проверки CORS, яувидеть, что присутствует «Access-Control-Allow-Origin»:

HTTP / 2.0 200 OK
дата: вт, 12 марта 2019 15:22:57 GMT
content-type: application / json
длина-содержимого: 0
x-amzn-requesttid: [x-amzn-Requesttid]
access-control-allow-origin: *
access-control-allow-headers: Content-Type, X-Amz-Date, Authorization, X-Api-Key, X-Amz-Security-Token
x-amz-apigw-id: [x-amz-apigw-id]
access-control-allow-method: GET, OPTIONS
X-Firefox-Spdy: h2

Я пытался использовать и fetch и request пакетов для моего запроса со следующим кодом (я обернул вызов request в Promise, чтобы использовать асинхронный поток ожидания, такой как вызов fetch ):

const getPolicy = (baseUrl, bucketNameTranscribe, fileName, apiKey) => (
    new Promise((resolve, reject) => {
        request({
             url: `${baseUrl}?bucketName=${bucketNameTranscribe}&key=${fileName}`,
             method: "GET",
             headers: {
                 "x-api-key": apiKey
             }
        }, ((error, response) => {
            if (error) {
                reject(error);
            } else if (response.statusCode === 200) {
                resolve(JSON.parse(response.body));
            } else {
                reject(response);
            }
        });
    })
);

const upload = async() {
    const {
        policyUrl,
        bucketNameTranscribe,
        apiKey
    } = awsConfig;
    const fileName = `${Date.now()}.mp3`;
    const req = new Request(
        `${policyUrl}?bucketName=${bucketNameTranscribe}&key=${fileName}`,
         {       
             method: "GET",
             headers: new Headers({
                 "x-api-key": apiKey
             })
         }
    );

    try {
        const response1 = await fetch(req);
        console.log("fetch", response1);
    } catch (error) {
        console.error("errorFetch", error);
    }

    try {
        const response2 = await getPolicy(policyUrl, bucketNameTranscribe, fileName, apiKey);
        console.log("request", response2);
    } catch (exp) {
        console.error("errorRequest", exp);
    }
}

Заранее спасибо за помощь

1 Ответ

0 голосов
/ 12 марта 2019

Сообщение об ошибке гласит:

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

Заголовок Access-Control-Allow-Origin отсутствует в фактическом ресурсе, а не в ответе на запрос предварительных опций.

Он должен быть включен в обоих .

...