Промежуточное программное обеспечение родительского маршрутизатора не выполняется в дочернем маршрутизаторе - PullRequest
0 голосов
/ 27 марта 2020

У меня есть 2 маршрутизатора на моем expressjs сервере. Одним из них является основной, который имеет следующее промежуточное программное обеспечение:

app.use(function (req, res, next) {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type,x-auth-token');
  res.setHeader('Access-Control-Allow-Credentials', true);
  res.setHeader('Access-Control-Expose-Headers', 'x-auth-token');
  next();
});

Тогда есть такой маршрут: app.use ('/ restaurant', restaurant_router);

И внутри restaurant_router I have: router.use ('/: restaurant_id / orders', restaurant_order_router);

А внутри restaurant_order_router у меня есть запрос get.

Что происходит, когда я отправляю запрос GET /restaurants сначала он отправляет запрос OPTIONS, потому что я отправляю x-auth-token в заголовках, а затем отправляет запрос GET.

Но когда я пытаюсь использовать те же заголовки и отправлять запрос на дочерний маршрутизатор GET /restaurants/:restaurant_id/order он завершается с 500 и говорит, что http http отсутствует.

Я посмотрел на проблему и увидел, что если я добавлю app.options('*', (req, res) => res.sendStatus(200)); в root роутер, он начнет работать.

Почему это так? Почему я должен установить эти параметры самостоятельно? Почему он не работает так же, как и с запросом GET /restaurants?

1 Ответ

0 голосов
/ 27 марта 2020

Если вы добавите весь соответствующий код в свой вопрос, мы можем убедиться в этом, но, похоже, что в запросе OPTIONS вы правильно установили заголовки в своем промежуточном программном обеспечении, но тогда у вас нет маршрута, который отправляет Ответ 2xx на запрос OPTIONS. Это означает, что он, вероятно, переходит к обработчику по умолчанию 404.

С другой стороны, когда вы добавили явный обработчик для:

app.options('*', (req, res) => res.sendStatus(200));

, тогда вы добавляли что-то, что возвращало бы 200 статус для запроса ОПЦИИ. Итак, это, кажется, недостающий кусок. Вы также можете сделать это следующим образом:

app.use(function (req, res, next) {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type,x-auth-token');
  res.setHeader('Access-Control-Allow-Credentials', true);
  res.setHeader('Access-Control-Expose-Headers', 'x-auth-token');
  if (req.method === "OPTIONS") {
    res.sendStatus(200);
  } else {
    next();
  }
});

Имейте в виду, что это промежуточное ПО позволяет любой веб-странице использовать этот сервер. Возможно, вы захотите ограничить его указанным c доменом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...