graphql 订阅无法连接到弹性 beantalk 的 websocket 端点

Posted

技术标签:

【中文标题】graphql 订阅无法连接到弹性 beantalk 的 websocket 端点【英文标题】:graphql subscription Could not connect to websocket endpoint at elastic beanstalk 【发布时间】:2021-01-08 05:59:28 【问题描述】:

我在 Elastic Beanstalk 上使用应用程序负载均衡器运行了 graphql-yoga(GraphQL 服务器)应用程序。我能够进行查询和变异。但是当我使用 GraphQL 游乐场尝试订阅时,它没有连接到以下错误。 "error": "无法连接到 WebSocket 端点 wss://domainname.com/subscriptions。请检查端点 URL 是否正确。"

我检查了应用程序在本地和 Heroku dyno 中运行良好。 我检查了 AWS CloudWatch 日志。使用 [0mGET /subscriptions [33m404 [0m3.860 ms - 152[0m

] 记录请求

【问题讨论】:

【参考方案1】:

我实际上遇到了同样的问题,发现它与我的服务器端口如何启动以及我如何在我的 FE 上配置我的 Apollo Provider 有关。注意“ws”不起作用,它也需要“wss”才能为我工作。我没有像您使用“/subscriptions”那样将任何内容定向到特定的 url。相反,我只是使用 Heroku/localhost 提供给我的任何 URI

服务器 GraphQLServer 代码:

const server = new GraphQLServer(
  typeDefs,
  resolvers,
  context:  pubsub, endpoint: "/" ,
);

服务器启动代码:

server.start(( port ) => 
  console.log(`Server listening on $port for incoming requests`);
);

FE Apollo 提供者配置

const httpLink = new HttpLink(
  uri: "https://domainName.herokuapp.com,
);

const wsLink = new WebSocketLink(
  uri: "wss://domainName.herokuapp.com/",
  options: 
    reconnect: true,
  ,
);

const splitLink = split(
  ( query ) => 
    const definition = getMainDefinition(query);
    return (
      definition.kind === "OperationDefinition" &&
      definition.operation === "subscription"
    );
  ,
  wsLink,
  httpLink
);

const client = new ApolloClient(
  link: splitLink,
  uri: "https://domainName.herokuapp.com",
  cache: new InMemoryCache(
    addTypename: false,
  ),
);

希望这可以帮助您并让您继续前进。花了半天时间弄清楚自己。我认为这对您来说可能是相同的情况,只是您的情况略有不同。编码愉快!!!

【讨论】:

【参考方案2】:

我发现附有 Elastic Beanstalk 的 EC2 实例具有默认的 nginx 配置。 我已经手动更改了 nginx.conf 与

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

它成功了。More Info

【讨论】:

我试过了,但没有用,你能告诉我整个确切的设置吗?

以上是关于graphql 订阅无法连接到弹性 beantalk 的 websocket 端点的主要内容,如果未能解决你的问题,请参考以下文章

通过 apollo 连接到 graphql-yoga 服务器进行订阅的正确方法是啥?

Vert.x - 带有 DataInputStreams 的 GraphQL 订阅

弹性beantalk docker应用程序无法连接到mysql

Docker:无法连接到弹性搜索表单spring boot docker image

Apollo 客户端无法连接到 GraphQL 服务器(http 调用执行失败)

如何使用另一种编程语言连接到 apollo graphql-websocket?