Форум программистов, компьютерный форум, киберфорум
Node.js
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
331 / 238 / 80
Регистрация: 15.11.2017
Сообщений: 453
Записей в блоге: 4

Почему CORS-middleware не ставит хедеры для другого middleware в Express?

13.12.2021, 22:05. Показов 848. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Упрощенный код:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const app = express();
app.use(express.json());
 
// CORS middleware
app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  next();
});
 
// Error middleware
app.use((err, req, res, next) => {
  res.status(400).json({ message: 'Server error!' });
});
CORS middleware функция ставит нужные хедеры на все запросы.
Но если ошибка случается в самой middleware, то не ставит, хотя CORS middleware вызван в use() раньше, чем Error middleware функция.

Пример источника ошибки - приходящий "битый" JSON, из-за чего middleware express.json() не может распарсить в req.body нужные значения.

Вопрос: почему CORS middleware не ставит хедеры? Она 100% срабатывает, но в error middleware приходит объект response без этих хедеров!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.12.2021, 22:05
Ответы с готовыми решениями:

Express middleware запускается несколько раз за один запрос
Здраствуйте, друзья! Где то у книге читал что если размещать промежуточною функцию до розмищения статики то при вызовах к папке паблик...

Middleware Golang
Добрый день! Объясните, пожалуйста, что такое middleware и зачем он нужен Гугл помочь не смог, потому что одна и та же статья...

Несколько Middleware
Создал empty project. Добавил 2 класса: LoggingMiddleware.cs public class LoggingMiddleware { private...

6
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
13.12.2021, 22:33
А почему вы уверены, что CORS middleware вообще срабатывает?
0
331 / 238 / 80
Регистрация: 15.11.2017
Сообщений: 453
Записей в блоге: 4
13.12.2021, 22:33  [ТС]
Кстати, проблему можно решить, если
JavaScript
1
app.use(express.json());
вызвать после middleware с корсами.

Добавлено через 27 секунд
Цитата Сообщение от DrType Посмотреть сообщение
А почему вы уверены, что CORS middleware срабатывает?
По console.log().
0
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
13.12.2021, 22:37
Просто я изготовил такой упрощённый пример, и там вторая middleware не отработала...
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const express = require('express');
const app = express();
 
// I break it all
app.use((req, res, next)=>{
  throw new Error('Error!')
  next()
})
// CORS middleware
app.use((req, res, next) => {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
  res.header("Access-Control-Allow-Headers", "Content-Type");
  console.log('CORS worked.') // тишина...
  next();
});
 
// Error middleware
app.use((err, req, res, next) => {
  res.status(400).json({ message: "Server error!" });
});
app.get('/', (req, res)=>{
  res.send("Hi!")
})
0
331 / 238 / 80
Регистрация: 15.11.2017
Сообщений: 453
Записей в блоге: 4
13.12.2021, 22:47  [ТС]
Вот весь файл:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import http from 'http';
import express from 'express';
import { login } from './login.js';
 
const app = express();
 
app.use(express.json());
 
// CORS middleware
app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  console.log('CORS middleware');
  next();
});
 
// Error middleware
app.use((err, req, res, next) => {
  // res.header('Access-Control-Allow-Origin', '*');
  console.log('Error middleware');
  res.status(400).json({ message: 'Server error!' });
});
 
app.get('/', (req, res) => {
  res.send('Main page');
});
 
app.options('/chat/login', (req, res) => { res.send(''); });
app.post('/chat/login', login);
 
const server = http.createServer(app);
server.listen(3000);
Лог ноды после ПОСТ-запроса:
Code
1
2
CORS middleware
Error middleware
В браузере:
Code
1
Access to fetch at 'http://localhost:3000/chat/login' from origin 'http://localhost:5555' has been blocked by CORS policy: 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.
0
Эксперт JS
 Аватар для DrType
6553 / 3624 / 1075
Регистрация: 07.09.2019
Сообщений: 5,877
Записей в блоге: 1
13.12.2021, 23:47
Я послал невалидный JSON ({) и заметил ещё вот что: если вывести в консоль res.getHeaders() в конце тела функции CORS middleware, то видим все те заголовки, которые мы хотели установить. При повторном выводе в консоль, но уже в функции — обработчике ошибок, видим пустые заголовки...

Добавлено через 15 минут
Более того, такой вот наивный эксперимент: введём глобальную переменную response_; в CORS middleware приравняем response_ = res, а в обработчике ошибок проверим response_ == res. Если JSON невалидный, то проверка выдаёт false...
Я похоже не до конца понимаю, как express обрабатывает ошибки.
1
331 / 238 / 80
Регистрация: 15.11.2017
Сообщений: 453
Записей в блоге: 4
14.12.2021, 09:54  [ТС]
Действительно, объект response другой! Очень любопытное поведение.

Если же app.use(express.json()); вызвать после CORS middleware, то объект response будет тот же самый.

Добавлено через 3 минуты
Теоретически express правильно делает. Вопрос в том, почему console.log в CORS middleware срабатывает после ошибки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.12.2021, 09:54
Помогаю со студенческими работами здесь

Простой middleware
Хочу написать простейший middleware. Выдает ошибку Function name must be a string Вот что есть: Создал middleware <?php ...

Middleware golang
Здравствуйте, подскажите пожалуйста как я могу прокинуть во все func(http.ResponseWriter, *http.Response) одинаковое значение, предположим...

Middleware Architect
Middleware Architect Требования • Высшее техническое образование. • Опыт работы от 3 лет в компаниях с крупной распределенной...

Ведущий разработчик middleware
Вакансия в компании Госброкер Обязанности: • подготовка ТЗ по функциональным требованиям • работа с подрядчиками • разработка...

Авторизация через middleware
Добрый день, сразу скажу, что я абсолютной новичок в данной теме, но мне очень нужна помощь. Требуется пример сайта с простейшей...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru