#javascript #express #cors #middleware
#язык JavaScript #экспресс #корс #промежуточный слой
Вопрос:
У меня есть CORS, глобально настроенный таким образом, для обработки учетных данных:
app.use(cors({ origin: 'https://example.com', credentials: true }))
Но на определенных маршрутах мне нужно разрешить запросы опций, поэтому, следуя документации, я делаю что-то вроде этого:
router.options('/someroute', cors()) router.get('/someroute', cors(), someOtherMiddleware, async (req, res) =gt; { // do stuff }
Моя глобальная политика CORS, похоже, переопределяет политику маршрута, но, я думаю, только в методе опций. Я пытаюсь придумать способ, как заставить обе эти политики CORS хорошо работать. Я также попробовал следующее, но это тоже не работает. Какой бы я ни поставил первым, кажется, что он переопределяет другой.
app.options('*', cors()) app.use(cors({ origin: 'https://example.com', credentials: true }))
Комментарии:
1. Промежуточное программное обеспечение cors по умолчанию устанавливает глобальный
OPTIONS
обработчик . Вы хотите сказать, что хотите отключить это для некоторых маршрутов?2. Если я правильно понимаю, в том
app.use()
месте, где я устанавливаю конкретный источник, это означает, что все запросы параметров требуют этого источника? Если да, то да, мне нужно отключить это для определенных маршрутов и разрешить все источники для запросов опций.3. «означает ли это, что все запросы опций требуют этого источника?» да, для всех запросов с перекрестным источником. Однако метод запроса на самом деле не входит в него
4.
app.use()
охватывает все типы запросов, включая GET, PUT, POST, ПАРАМЕТРЫ, ЗАГОЛОВОК, УДАЛЕНИЕ и т.д.5. Я действительно не могу сказать, с какой проблемой вы просите о помощи здесь. Если вы
app.use(cors({ origin: 'https://example.com', credentials: true }))
указали это перед всеми вашими маршрутами, то сначала он начнет действовать, и, если он настроен на автоматическую обработку запроса перед полетом для вас, он просто обработает его, и никакие другие маршруты не получат возможности просмотреть его. Экспресс-маршруты и промежуточное программное обеспечение обрабатываются в том порядке, в котором они объявлены.
Ответ №1:
Причина, по которой мой 2-й фрагмент кода выше не работал должным образом, заключалась в том, что мне нужно было добавить preflightContinue
свойство при настройке политики cors на уровне приложения. В противном случае он будет игнорировать политики cors для маршрутов параметров, установленных на уровне маршрута. Что — то вроде плохо документированной вещи.
Окончательное решение состояло в том, чтобы сделать это на уровне приложения:
app.use(cors({ origin: 'https://example.com', credentials: true, preflightContinue: true, }))
Теперь эта политика cors в отношении маршрута опций действительно работает:
router.options('/someroute', cors()) router.get('/someroute', cors(), someOtherMiddleware, async (req, res) =gt; { // do stuff }
Тьфу, потратил так много времени, выясняя это. Надеюсь, это сэкономит кому — то немного времени.