Я знаю, что эта проблема была освещена во многих сообщениях по всему Интернету, и я думаю, что пробовал их все, но я все еще получаю ошибку 403 CORS в своем локальном приложении реагирования.
Вот частично заголовки из Dev Tools:
#GENERAL:
Request URL: https://<myGatewayApiUrl>.amazonaws.com/dev/api/byid/1/129
Request Method: OPTIONS
Status Code: 403
#RESPONSE HEADERS
access-control-allow-headers: Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token
access-control-allow-methods: GET,OPTIONS
access-control-allow-origin: *
content-length: 42
content-type: application/json
Я работал в шлюзе API, устанавливая Enable CORS, но я получаю сообщение об ошибке для одного метода получения Add Access-Control-Allow-Origin Integration Response Header Mapping to GET method -> invalid response status code specified - Но устанавливаются заголовки OPTIONS и заголовок GET Access-Control-Allow-Origin.
Я использую пакеты express и cors, вот фрагмент из моего файла API index.js:
const app = express();
app.use(cors());
app.options('*', cors());
Вот код запроса из приложения React:
export const getRecordById = async (userId, id, token) => {
try {
const response = await axios.get(
process.env.REACT_APP_API_URL + `/byid/${userId}/${id}`,
{
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
},
}
);
return response.data;
} catch (error) {
console.info('ERROR', error);
return error;
}
};
Вот мой код ответа от Lambda API:
getById: asyncHandler(async (req, res, next) => {
const { user, id } = req.params;
const result = await recordsService.getRecordById(user, id);
res.set({
'content-type': 'application/json',
'Access-Control-Allow-Origin': '*',
});
if (!result) {
res.status(400).json({
error: true,
message: 'get record by ID action failed',
data: {},
});
}
res.status(200).json({
error: false,
message: 'successful record retrieval',
data: {
record: result,
},
});
}),
Кроме того, у меня есть http-события файла serverless.yml, установленные как таковые: (насколько я понимаю, cors: true должен обрабатывать предварительные запросы)
- http:
path: /api/records/byid/{user}/{id}
method: GET
cors: true
Я потратил слишком много времени, пытаясь понять это. Это должно быть что-то простое и глупое, правильно ли я использую res.set()? Все выглядит правильно, я знаю, что что-то упускаю. Спасибо
Шлюз API отклонит вызов с ошибкой CORS, если URL-адрес не найден по умолчанию.
Похоже, Axios не хватает бита /records в URL-адресе запроса.
Ваш бессерверный шаблон определяет URL-адрес как /api/records/byid/{user}/{id}, но Axios, похоже, вызывает /dev/api/byid/1/129 без бита records.