Laravel GraphQL运行Subscription报错:无法连接websocket端点如何解决?
报错根因与解决方法
核心根因
该报错是graphql-playground无法与后端建立WebSocket连接导致,属于传输层连接故障,和Subscription业务逻辑本身无关。
排查与解决步骤
- 确认WebSocket服务已启动
Laravel默认的8000端口是HTTP服务端口,不处理WebSocket请求,需要单独启动对应服务:- 若使用Lighthouse+Laravel Websockets扩展,执行命令
php artisan websockets:serve启动服务,默认监听6001端口 - 若使用Pusher兼容方案,确认Pusher相关配置(app_id、key、secret、host、端口)与
.env文件中配置完全一致
- 若使用Lighthouse+Laravel Websockets扩展,执行命令
- 修正graphql-playground的WebSocket端点
playground默认会复用当前HTTP地址的端口作为WebSocket端口,需要手动修改端点配置:
如果你用Laravel Websockets默认配置,将WebSocket端点改为ws://127.0.0.1:6001/graphql即可;如果服务开启了HTTPS,需要将前缀改为wss:// - 检查GraphQL路由配置
确认你的路由文件中已经注册了GraphQL的WebSocket路由,Lighthouse默认会自动注册,如果你手动修改了路由前缀,需要对应调整WebSocket端点的路径 - 修复现有代码疏漏
你的现有代码存在两个会影响后续订阅生效的问题:UserMutator的create方法中注释了return $user;,Mutation需要返回User对象才能触发后续广播逻辑,取消该注释即可- 你的Subscription查询中请求的
username、password字段在User类型定义中不存在,要么删除查询中的这两个字段,要么给User类型补充对应字段定义
- 检查跨域配置
如果你的graphql-playground访问地址和Laravel服务不是同域同端口,需要确认config/cors.php中已经将graphql/*加入允许路径,且请求源在允许列表中
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

