Промежуточное программное обеспечение Express CORS для обработки как предполетных, так и обычных запросов

#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 }  

Тьфу, потратил так много времени, выясняя это. Надеюсь, это сэкономит кому — то немного времени.