Я создаю приложение, которое подключается с помощью бессерверного API на AWS (API Gateway / Lambda) через AWS Amplify, которое используется в веб-интерфейсе (React).
Когда запрос успешен, все работает просто отлично (определенно, я полагаю). Там нет вопросов CORS или что-нибудь. Но если я попытаюсь вернуть «неудачный» ответ, мой интерфейс не получит этот ответ. Он получает общий Network Error
без информации о том, что произошло, и консоль регистрирует ошибку.
Я думаю, что код будет иметь больше смысла в этом. Я запрашиваю к API, используя такой код (Amplify настроен в другом месте):
import { API } from 'aws-amplify';
...
API.get('apiName', path, options)
.then(response => {
// Whatever
})
.catch(err => {
// Whatever
})
В Lambda я возвращаю (и Cloudwatch проверяет это, когда я регистрирую прямо перед запуском callback(null, responseObject)
) объект полного ответа, подобный этому:
{
"statusCode": 200,
"headers": {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": true
},
"body": "{ /* whatever */ }"
}
или это:
{
"statusCode": 500,
"headers": {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Credentials": true
},
"body": "{ /* error here */ }"
}
В случае 200
ответ полностью достигает моего интерфейса (отображается в функции .then
как response
). В случае 500
(или общей ошибки) .catch
называется , а err
объект - не , который я поместил в тело ответа, а скорее универсальный Network Error
без соответствующей информации (или кода состояния):
Error: Network Error
at createError (createError.js:16)
at XMLHttpRequest.handleError (xhr.js:87)
Чтобы уточнить, просто изменение statusCode
с 200 на 400 означает, что запрос перехватывается на интерфейсе (хорошо), и что ошибка не содержит никакой информации, которую я возвращаю из Лямбда (плохо).
Консоль также регистрирует ошибки:
DELETE https://abcdefg.execute-api.us-west-2.amazonaws.com/development/my-endpoint 403 ()
Failed to load https://abcdefg.execute-api.us-west-2.amazonaws.com/development/my-endpoint: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 403.
Он также регистрирует вещи, связанные с ошибкой CORS, что не имеет смысла для меня, потому что я следую точному тому же шаблону, что и для случаев успеха, только с более высоким statusCode
.
Cross-Origin Read Blocking (CORB) blocked cross-origin response https://abcdefg.execute-api.us-west-2.amazonaws.com/development/my-endpoint with MIME type application/json.
XHR failed loading: DELETE "https://abcdefg.execute-api.us-west-2.amazonaws.com/development/my-endpoint".
Есть идеи, что здесь происходит? Очень печально не иметь доступа к настоящей информативной ошибке на веб-интерфейсе. Пожалуйста, дайте мне знать, если есть какая-либо другая информация, которая будет полезна для решения этой проблемы.
РЕДАКТИРОВАТЬ - следуя приведенным ниже комментариям @ Майкла, я проверил, использует ли мое приложение лямбда или лямбда-прокси, и на самом ли деле он использует лямбда-прокси, который должен не производит такое поведение, насколько я понимаю.
Вот некоторый код в моем файле serverless.yml,
functions:
projectsGetAll:
handler: handlers/projects/getAll.handler
events:
- http:
path: projects
method: get
cors: true
authorizer: aws_iam
А вот снимок экрана (с удаленной конечной точкой) от AWS API Gateway для одной из этих конечных точек:
Я хочу подтвердить, что это неожиданное поведение для лямбда-прокси. Возможно, есть какие-то настройки, которые все портят?