我开发了一个演示项目来说明我正在做的关于Mercure协议的演示,其中我还使用了 API 平台。我使用了自动发现机制来检索 Mercure 集线器 url(API 平台发送一个Link
标头,以便前端应用程序可以在事先不知道的情况下获取集线器 url)。但是我不得不进行重构(该项目使用的是我工作的公司的 docker images 和 composer repo,我第一次展示 Mercure 的地方),并且在某些时候(我不记得确切的时间),自动发现机制不起作用了。
我发现它为什么不起作用,那是因为 API Platform 发送了.env
文件中指示的 Mercure 集线器 url,它不是http://localhost:3000/.well-known/mercure
(我订阅的集线器 url),但是http://mercure/.well-known/mercure
,其中第一个mercure
是我的名称美居码头集装箱。我的前端应用程序试图订阅那个不存在的 url。为了暂时解决这个问题,我刚刚在我的前端应用程序中硬编码了集线器 url,但我真的很想知道是否有解决方案可以将自动发现机制与 Mercure docker 映像一起使用。
我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
注意:我尝试过设置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
}
我的 docker-compose 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