#node.js #cors #httprequest #preflight #architect
Вопрос:
Я сталкиваюсь со странной ошибкой с cors при выполнении запроса со страницы react на мой сервер, для запуска которой используется платформа arc.codes. Это полная ошибка:
Access to fetch at 'http://localhost:3333/api/endpoint' from origin 'http://localhost:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
Мой внешний код, который сделал запрос, выглядит следующим образом:
const options = {
method: 'GET',
headers: {
'Authorization':'Bearer token'
},
};
const response = yield call( fetchJSON, `${process.env.REACT_APP_BACKEND_URL}/contractormonths`, options );
Внутренний код, который обрабатывает запросы:
файл манифеста .arc:
@app
my-app
@http
get /api/contractormonths
index.js файл в /get-api-месяцы подрядчика
const arc = require('@architect/functions');
const { authorization } = require('@architect/shared/oauth');
async function route(request){
return {
cors: true,
json: {'message':'Hello world!'}
};
}
exports.handler = arc.http.async(authorization, route);
Функция авторизации также возвращает объект со свойством cors: true
То, что я уже пробовал и чему научился:
- Я думаю, что запрос не попадает в функцию обработчика GET в задней части
- Когда я удалил промежуточное программное обеспечение аутентификации (сзади) и заголовок аутентификации (спереди), это работает!
- Вероятно, это связано с запросом перед полетом, сделанным браузером (когда это простой GET без заголовков, он не отправляет запрос перед полетом, но делает это при использовании заголовка auth).
- Предполетный запрос отправляет запрос ПАРАМЕТРОВ на мой сервер, я могу подтвердить это, потому что добавление обработчика запроса ПАРАМЕТРОВ в мой сервер получает запросы вместо обработчика GET
Что я могу сделать, чтобы обработать эти предварительные запросы в моем бэкэнде? Нужно ли мне писать обработчик запроса ПАРАМЕТРОВ для всех моих текущих конечных точек? Есть ли способ отключить предполетный запрос? Можно ли отключить предполетный запрос? Не упускаю ли я еще одну важную вещь и не усложняю ли это?
Ответ №1:
Трудно сказать, не видя кода вашей authorization
функции, но именно в этом и кроется корень проблемы. Вы упомянули в своем вопросе, что:
Функция авторизации также возвращает объект со свойством cors: true
но на самом деле вы не хотите возвращать объект из этой функции, если только вы не выполнили шаг аутентификации.
Пример метода авторизации может выглядеть следующим образом:
module.exports = async function auth (req, res, next) {
// Do the OAuth Dance
const oauth = oauthDance()
if (!oauth.authenticated) {
return {
status: 401,
json: { errors: [ 'authorization_failed' ] }
}
} else {
// Oauth succeeded so let's add the token to the request
// for the next function in the chain
req.token = oauth.token
next()
}
}
Это довольно надуманный псевдокод, но я подозреваю return
, что ваш authorization
метод приводит к короткому замыканию цепи, и именно поэтому предполетная проверка завершается неудачей. Использование next()
для перехода к следующей функции в цепочке должно решить вашу проблему.