无法将 GraphQL 查询从 Apollo 客户端发送到 Rails GraphQL 后端

Posted

技术标签:

【中文标题】无法将 GraphQL 查询从 Apollo 客户端发送到 Rails GraphQL 后端【英文标题】:Cannot send GraphQL query from Apollo Client to Rails GraphQL backend 【发布时间】:2018-03-25 22:10:00 【问题描述】:

我使用 Rails 作为 GraphQL 后端,使用插件 graphql-ruby。在前端大小方面,我将 Apollo Client 用于我的 react/redux 项目。

这是我的前端:

const networkInterface = createNetworkInterface(
  uri: 'http://localhost:4001/graphql',
);
export const apolloClient = new ApolloClient( networkInterface );

在我的后端,我已经成功测试了http://localhost:4001/graphiql 上的以下查询。

query
  allAuthors
    full_name,
    books
      book_name,
      book_description,
      isbn
    
  
   

这是我的 Rails 路线配置:

if Rails.env.development?
    mount GraphiQL::Rails::Engine, at: "/graphiql", graphql_path: "/graphql"
  end

  post "/graphql", to: "graphql#execute"

我尝试从前端获取类似的数据。这是我的代码:

    const ALL_AUTHORS_QUERY = gql`
      query allAuthors 
        full_name,
        books
          book_name,
          book_description,
          isbn
        
      
    `;
    apolloClient
      .query(
        query: ALL_AUTHORS_QUERY,
      )
      .then(response => console.log(response.data));
  

但在那之后,我遇到了以下异常:

POST http://localhost:4001/graphql 422 (Unprocessable Entity)

请告诉我我做错了什么?谢谢

@编辑 1: 我也在客户端尝试了不同的查询,但问题还是一样。

   const ALL_AUTHORS_QUERY = gql`
  query 
    allAuthors 
      full_name
      books 
        book_name
        book_description
        isbn
      
    
  
`;
apolloClient
  .query(
    query: ALL_AUTHORS_QUERY,
  )
  .then(response => console.log(response.data));

【问题讨论】:

【参考方案1】:

在客户端,当 allAuthors 是 GraphQL 类型时,您已将查询命名为 allAuthors。您不必将查询命名为可选的。但是,allAuthors 是查询根的必需类型。

query allAuthors 你的查询以这个开头,什么时候应该是这样的query allAuthors

【讨论】:

你能详细解释一下吗?我不明白。 我已经按照你说的更新了。问题还是一样。我已经更新了我的问题以供您查询。请看一看。

以上是关于无法将 GraphQL 查询从 Apollo 客户端发送到 Rails GraphQL 后端的主要内容,如果未能解决你的问题,请参考以下文章

无法在单个 GraphQL 查询中组合本地和远程数据(Next.js + Apollo)

GraphQL/Apollo 客户端:如果查询是先前查询的子集,则从缓存中获取数据

从 iOS 客户端上传文件到 GraphQL

GraphQL + Apollo 请求

使用 Apollo 客户端将文件上传到 GraphQL

React JS + Apollo 客户端查询错误:“网络错误:无法获取”。从手机打电话时