ApolloServer:“无法连接到 websocket 端点 ws://localhost:4000/subscriptions。请检查端点 url 是不是正确。”

Posted

技术标签:

【中文标题】ApolloServer:“无法连接到 websocket 端点 ws://localhost:4000/subscriptions。请检查端点 url 是不是正确。”【英文标题】:ApolloServer: "Could not connect to websocket endpoint ws://localhost:4000/subscriptions. Please check if the endpoint url is correct."ApolloServer:“无法连接到 websocket 端点 ws://localhost:4000/subscriptions。请检查端点 url 是否正确。” 【发布时间】:2021-08-29 09:11:28 【问题描述】:

我无法实现任何订阅,因为当我尝试使用 GraphQL Playground 监听某个端点时它突然断开连接:

"error": "Could not connect to websocket endpoint wss://localhost:4000/graphql. Please check if the endpoint url is correct."

我单独使用 ApolloServer,没有 express 或其他任何东西。它使用 Docker 使用 node14 镜像进行容器化,端口被正确转发,查询和突变工作正常。

这是配置sn-p:

const server = new ApolloServer(
    typeDefs: mergedTypeDefs,
    resolvers: mergedResolvers,
    playground: 
        subscriptionEndpoint: 'ws://localhost:4000/graphql'
    ,
    subscriptions: 
        keepAlive: 9000,
        onConnect: (connParams, webSocket, context) => 
            console.log('CLIENT CONNECTED');
        ,
        onDisconnect: (webSocket, context) => 
            console.log('CLIENT DISCONNECTED')
        
    ,
    context: 
        models
    
);

我尝试了一切,从使用“wss”而不是“ws”来更改路径。我检查了错别字,没有找到。困扰我的是路径是相同的,所以它至少应该尝试通过 onConnect 或 onDisconnect 通知我,但它没有。

这是通过 Chrome 的开发工具发出的消息:

到 'wss://localhost:4000/graphql' 的 WebSocket 连接失败:在建立连接之前 WebSocket 已关闭。

我用容器外的“教程”项目测试了订阅,它运行良好。

有时,订阅的唯一有效功能是 onDisconnect,但在 PlayGround 上收到错误消息后 2-5 秒后,它仍然没有让我对问题有任何了解。

感谢任何帮助或建议。

【问题讨论】:

你可以试着移除操场吗?并且上下文字段应该是一个函数,而不是一个对象 我试过移除操场,没有用。 您是否尝试减少keepAlive进行测试?可能到 4000 【参考方案1】:

wss没有证书在本地肯定不行,所以用ws作为协议吧。

如果它在没有 Docker 的情况下也能工作,那么代码方面的一切都应该没问题。

您还应该确保已正确映射端口,即暴露端口 4000 https://docs.docker.com/engine/reference/commandline/run/#publish-or-expose-port--p---expose

【讨论】:

在容器外停留 30 秒(最大超时?)然后关闭连接,但它收到套接字消息并按预期工作。订阅在容器内工作,但这是一个非常奇怪的情况,因为连接会在我能够做某事之前立即关闭。我检查了端口,它应该被转发。我的意思是,查询和突变在容器内工作,游乐场和订阅是最重要的部分 你能发布你的 Dockerfile 和运行命令吗?您是否尝试过检查 docker 日志?另外,尝试将 0.0.0.0 而不是 localhost 作为地址。 我正在使用由 vscode 生成的远程容器,我检查了 docker 日志,它除了“docker 已初始化”之外没有显示任何内容。我尝试将 0.0.0.0 作为游乐场的“订阅端点”,似乎有时它会在一次失败后工作,而另一些则无法工作。我将在帖子中添加我的 docker 配置。

以上是关于ApolloServer:“无法连接到 websocket 端点 ws://localhost:4000/subscriptions。请检查端点 url 是不是正确。”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ApolloServer 中添加响应头?

ApolloServer 模式选项

如何在 ApolloServer 中获取 req.user

ApolloServer 2.0 上下文和 GraphQL API 的公共/私有部分

ApolloServer:“无法连接到 websocket 端点 ws://localhost:4000/subscriptions。请检查端点 url 是不是正确。”

支持 ApolloServer 中的 Objection `$formatJson`