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

问题描述

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

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

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

这是配置片段:

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 的开发工具发送的消息:

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

我使用容器外的“教程”项目测试了订阅效果很好。

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

感谢任何帮助或建议。

解决方法

如果没有证书,wss 肯定不会在本地工作,所以使用 ws 作为协议。

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

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