Как заставить механизм автообнаружения платформы API для концентратора Mercure работать с образом Docker?
Я разработал демонстрационный проект, чтобы проиллюстрировать свою презентацию о протоколе Mercure, в которой я также использую платформу API. Я использовал механизм автообнаружения для получения URL-адреса концентратора Mercure (платформа API отправляетLink
заголовок, чтобы переднее приложение могло получить URL-адрес хаба, не зная его заранее). Но мне пришлось провести рефакторинг (в проекте использовались образы докеров и репозиторий композитора от компании, в которой я работаю, где я впервые представил Mercure), и в какой-то момент (я не могу вспомнить, когда именно) механизм автообнаружения не работал больше.
Я выяснил, почему это не сработало, и это связано с тем, что платформа API отправляет URL-адрес концентратора Mercure, указанный в .env
файл, который не http://localhost:3000/.well-known/mercure
(URL-адрес хаба, на который я подписан), но http://mercure/.well-known/mercure
, где первая mercure
- это имя моего док-контейнера Mercure. И мое переднее приложение пыталось подписаться на этот URL, которого не существует. Чтобы временно решить проблему, я просто жестко запрограммировал URL-адрес хаба в своем переднем приложении, но мне действительно хотелось бы знать, есть ли решение использовать механизм автообнаружения с изображением докера Mercure.
Ошибка, которую я получаю, когда MERCURE_PUBLISH_URL
в .env
знак равно http://localhost:3000/.well-known/mercure
:
Couldn't connect to server for "http://localhost:3000/.well-known/mercure".
Мой .env
рабочая конфигурация:
MERCURE_PUBLISH_URL=http://mercure/.well-known/mercure
NB: я пробовал установить MERCURE_SUBSCRIBE_URL=http://localhost:3000/.well-known/mercure
но это ничего не изменило
Фрагмент моего переднего приложения, в котором я подписываюсь на хаб:
закомментированный код - это то, как автоматически обнаруживать URL хаба путем анализа заголовка ссылки, что я могу сделать прямо сейчас по причинам, описанным выше.
// const hubUrl = response.headers.link.match(/<([^>]+)>;\s+rel=(?:mercure|"[^"]*mercure[^"]*")/)[1];
const es = new EventSource(`http://localhost:3000/.well-known/mercure?topic=${document.location.origin}/api/pizzas/{id}`);
es.onmessage = ({data}) => {
// doing something here
}
Моя конфигурация Mercure для создания докеров:
mercure:
image: dunglas/mercure
container_name: mercure
environment:
ALLOW_ANONYMOUS: 1
JWT_KEY: aVerySecretKey
PUBLISH_ALLOWED_ORIGINS: '*'
CORS_ALLOWED_ORIGINS: http://localhost
ports:
- 3000:80