Перенаправление Nodejs не работает внутри контейнера Docker - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть два док-контейнера:

1- Api

2- Авторизация

Из авторизации я бы хотел перенаправить запросы пользователей на мой APIесли они проходят аутентификацию.

Итак, внутри моего контейнера аутентификации у меня есть:

if ( itsAuthenticated){
     req.redirect('http://api:8080/users/something')
    // req is the normall express request object
}

http://api:8080 относится к моему другому контейнеру, который выставляет 8080, и я связал его внутри моегоdocker-compose файл, как показано ниже:

  api:
    build: ./api
    ports:
    - "8080:8080"
    links:
    - mongo // api needs mongo and it's working fine
    volumes:
    - ./api:/code

  authorization:
    build: ./authorization
    ports:
    - "8088:8088"
    volumes:
    - ./authorization:/code
    links:
    - api // here I have a link to api container
   ... 

ПРИМЕЧАНИЕ:

Если я сделаю HTTP-запрос от authorization к моему API, он будет работать.

Сильфон работает нормально:

if ( itsAuthenticated){
    const result = await http.get('http://api:8080/users/something');
    console.log('**** result',result);
}

Таким образом, в основном, соединения в порядке, запрос get в порядке, перенаправление полностью работает за пределами Docker, но когда внутри контейнера,redirect не работает.

Оцените помощь.

ОБНОВЛЕНИЕ

Просто понял, что если я перенаправлю свои запросы на http://www.google.com, Я получаю результат, но он сразу умирает, когда я перенаправляю его на http://api:8080/users/something

Я уверен, что где-то что-то глупо пропускаю:)

1 Ответ

0 голосов
/ 20 сентября 2018

Когда вы отправляете этот перенаправленный вызов, выполняются следующие три шага:

  1. Браузер связывается, скажем, http://localhost:8088/ и отправляет запрос на вход.
  2. Сервер авторизации сообщает "о, 302, вы должны связаться с http://api:8080. "
  3. Браузер пытается связаться с http://api:8080.

Поскольку перенаправление действительно вступит в силу в браузере, вы должныотправьте обратно URL, который поймет браузер, что означает, что он не может использовать внутреннее DNS-имя Docker.

Простой, ориентированный на развитие ответ заключается в использовании http://localhost:8080 в качестве адреса перенаправления.Поскольку вы используете Express, может работать рецепт типа

req.redirect(`http://${req.hostname}:8080/users/something`)

(с использованием Request.hostname ), хотя это заставляет ваше приложение знать об опубликованном порте другой службы.

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