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

本地Docker环境下Hasura添加Rails远程Schema失败求助

解决Hasura添加本地Rails远程Schema失败的问题

核心问题分析

报错Failed reading: not a valid json value at '<!DOCTYPEhtml>'说明Hasura请求Rails GraphQL端点时,收到的是HTML错误页面而非合法的GraphQL JSON响应。结合ngrok显示的403 Forbidden,大概率是Rails的安全拦截机制(CSRF或CORS)导致的,而Rails日志无输出可能是请求未正确到达或日志配置问题。

分步解决方案

1. 关闭GraphQL端点的CSRF防护

Rails默认对POST请求启用CSRF校验,但服务端之间的GraphQL调用不需要这个防护。修改app/controllers/graphql_controller.rb,添加跳过校验的代码:

class GraphqlController < ApplicationController
  # 跳过CSRF校验
  skip_before_action :verify_authenticity_token

  def execute
    # 保留原有的execute逻辑
  end
end

2. 确保Rails服务器绑定到0.0.0.0

如果用host.docker.internal访问Rails,必须保证Rails不是仅绑定到127.0.0.1(只能宿主机本地访问)。启动Rails时执行:

rails s -b 0.0.0.0

可以进入Hasura容器测试连通性:

# 进入Hasura容器(替换为你的容器名)
docker exec -it hasura-container-name bash
# 测试请求
curl http://host.docker.internal:3000/graphql

如果返回类似{"errors":[{"message":"Must provide query string."}]}的JSON,说明连通正常。

3. 配置Rails的CORS规则(针对ngrok场景)

ngrok的请求属于跨域,Rails默认会拦截。修改config/initializers/cors.rb,添加允许ngrok域名的配置:

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'https://6e12fa99336b.ngrok.io' # 替换为你的ngrok域名,临时测试可用'*'
    resource '/graphql',
      headers: :any,
      methods: [:post] # GraphQL仅需POST方法
  end
end

修改后重启Rails服务器。

4. 修复Rails日志输出问题

如果Rails无日志输出,检查config/environments/development.rb的日志配置,确保日志输出到控制台:

config.logger = ActiveSupport::Logger.new(STDOUT)
config.log_level = :debug

重启Rails后,就能看到所有请求日志,确认Hasura的请求是否到达。

5. Hasura远程Schema配置注意事项

  • 确保请求方法设置为POST(Hasura默认值)
  • 如果Rails GraphQL需要认证,在Hasura的远程Schema配置中添加Authorization请求头(比如Bearer token)

内容的提问来源于stack exchange,提问作者William Pollet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:06:23