Ariadne GraphQL订阅无法连接ws://localhost:3001 WebSocket端点是什么原因
这个报错属于WebSocket连接建立阶段失败,还没有进入GraphQL订阅的逻辑执行环节,所以和你定义的类型、解析器无关,优先排查以下配置问题:
- 服务端未启用订阅支持:Ariadne默认不会开启WebSocket订阅能力,初始化GraphQL应用时必须显式传入
subscriptions=True参数才会监听WebSocket请求。如果使用FastAPI/Starlette集成,还需要单独挂载WebSocket路由到Ariadne实例,不能只挂载HTTP路由。
正确的基础配置参考:from ariadne import make_executable_schema from ariadne.asgi import GraphQL schema = make_executable_schema(type_defs, query, mutation, subscription) app = GraphQL( schema, debug=True, subscriptions=True, # 必须显式开启订阅支持 ) - WebSocket端点路径不匹配:你当前Playground连接的端点是
ws://localhost:3001/,如果服务端配置的订阅路径是/graphql(Ariadne默认值),则正确的连接地址应该是ws://localhost:3001/graphql,需要手动在Playground的WebSocket端点设置中修改为对应路径。 - 跨域配置拦截:如果你的GraphQL Playground和服务端部署在不同端口/域名下,需要在服务端的CORS中间件中开启WebSocket跨域许可,比如使用Starlette的CORSMiddleware时要设置
allow_websockets=True,同时将Playground的源地址加入allow_origins列表。 - 端口监听异常:确认你的ASGI服务(Uvicorn/Hypercorn等)确实在3001端口正常启动,没有端口被占用、服务启动报错退出的情况,可通过
netstat或lsof命令检查3001端口是否处于监听状态。 - WebSocket协议不兼容:旧版GraphQL Playground默认使用
subscriptions-transport-ws协议,而新版本Ariadne默认优先支持graphql-ws协议,两边协议不匹配会导致连接失败,可在初始化GraphQL应用时指定支持的协议来兼容:app = GraphQL( schema, subscriptions=True, # 同时支持两种常用订阅协议 subscription_protocols=("graphql-transport-ws", "graphql-ws"), )
内容的提问来源于stack exchange,提问作者crispengari
相关产品推荐
相关产品推荐

