1

我开发了一个演示项目来说明我正在做的关于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
4

0 回答 0