假设我在使用docker-compose运行2个容器/服务的主机上:
在我的react + apollo代码存在的前端容器中,我需要设置这个const:
// frontend container code
export const APOLLO = {
uri: 'http://0.0.0.0:8000/graphql' // << not working, what to use here?
};
但是,uri值无法成功连接到后端graphql端点。我收到Error Network error: request to http://0.0.0.0:8000/graphql failed, reason: connect ECONNREFUSED 0.0.0.0:8000
容器可以自行工作。我可以导航到http://0.0.0.0:8000
,http://0.0.0.0:8000/graphql
,http://0.0.0.0:8081
以单独与他们互动。我也可以输入每个容器,并通过ping backend
或ping frontend
的服务名称空间到达另一个容器。
但是,当我在代码中执行uri: 'http://backend:8000/graphql'
或uri: 'http://backend/graphql'
时,我收到错误Error Network error: only absolute urls are supported
。
在docker inspect backend
上,我将后端容器的IP地址视为:'172.18.0.5'
。其中我试图以uri: 'http://172.18.0.5/graphql'
插入uri,但我得到Error Network error: Network request failed with status 403 - "Forbidden"
在给定这些场景的情况下,如何将后端docker容器连接到代码中的前端?
谢谢!
答案 0 :(得分:2)
通过在本地运行服务器而不是Docker来修复它,并发现后端由于未设置CORS头而拒绝前端条目。列入白名单的前端&#39; ip和它工作。使用后端ip http://172.18.0.5/graphql
在Docker容器中再次测试,连接非常完美。
希望这有帮助!
修改:引用网址名称中的容器名称,即http://backend/graphql
也可以使用docker compose设置的docker网桥。这是比上面的docker container ip硬编码更好的解决方案。
答案 1 :(得分:0)
当节点提取无权访问协议或主机名时,会出现此问题
if (!parsedURL.protocol || !parsedURL.hostname) {
throw new TypeError('Only absolute URLs are supported');
}
根据graphql后端处理查询的方式,最好注销每个服务端点的URL,并确保URL包含主机AND协议,否则获取将失败。
对于我自己,当我的主机变量从我的服务端点的ENV返回undefined
时,我发生了错误。