You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:45:03