【问题标题】:graphql: Must provide Source. Received: {kind: "Document, definition ...}graphql:必须提供来源。收到:{种类:“文档,定义......}
【发布时间】:2019-10-30 13:34:02
【问题描述】:

我真的是 Graphql 的新手(实际上就在昨天)。我正在“玩耍”并尝试生态系统的各种工具(apollo-server、graphql.js ...等)。

为了试验,我试图从 nodejs 中调用查询(而不是从浏览器中的客户端,例如反应应用程序)

首先,这是我的简单架构以及解析器:

export const mySchema = gql`
   type User {
      id: ID!
      name:  
      surname: String
   }

   # root query has been defined in another file
   extend type Query {
      users: [User]
      test: [User]
   }
` 
export const myResolvers = {
   users: () => [ __array_of_users__ ],
   test: () => /* this is where I would like to re-invoke the 'users query'
}

使用makeExecutableSchema 函数,我用我的类型和解析器创建了一个schema 对象,并将这个模式导出到阿波罗服务器应用程序中。到目前为止一切正常。

现在在stackoverflow suggested solution 之后,我创建了一个帮助函数,它应该允许我调用在我的架构中定义的查询,如下所示:

import { graphql } from "graphql";
import { schema } from "./my-schema";

export const execute = str => {
  return graphql(schema, str );
};

有了这个辅助函数,我的解析器变成了:

import { gql } from "apollo-server-express";
import { execute } from '__path_to_helper_function__';

export const myResolvers = {
  users: () => [ __array_of_users__ ],
  test:  () => execute( gql`
     query users {
           name
      }    
  `)
}

但是在操场上,当我尝试查询时:

   {
      test {
        name
      }
   }

我收到以下错误:

我什至不知道我想要做什么(从节点内调用查询)是否可以完成。任何建议将不胜感激。

感谢

【问题讨论】:

    标签: node.js graphql resolver


    【解决方案1】:

    graphql-tag 接受一个字符串并将其解析为一个DocumentNode 对象。这实际上与将字符串传递给parse 函数相同。 graphql 模块导出的某些函数,如execute,期望在DocumentNode 对象中传递——graphql 函数没有。从签名中可以看出,它应该只传递一个纯字符串作为请求:

    graphql(
      schema: GraphQLSchema,
      requestString: string,
      rootValue?: ?any,
      contextValue?: ?any,
      variableValues?: ?{[key: string]: any},
      operationName?: ?string
    ): Promise<GraphQLResult>
    

    所以,只需删除 gql 标记即可。您可以看到一个(不完整的)API 参考 here。

    【讨论】:

    • 感谢您的回答。我按照建议删除了“gql”,现在传递了一个字符串:“查询用户{名称}”。我现在收到错误消息:“无法在“查询”类型上查询字段“名称”。”这个错误意味着什么?
    • 您正在请求根查询类型上的字段name,该字段不存在。大概你的意思是query { users { name } }。前者仍然有效,因为 users 只是被视为操作的名称。
    • 我尝试了你的建议query { users { name } },不幸的是我遇到了同样的错误......
    • @TheSoul 您是否像以前一样收到 same 错误? Cannot query field "name" on type "Query"
    • 无论哪种方式,这可能应该是一个包含所有相关代码的单独问题。您看到的错误与您的原始问题无关。
    猜你喜欢
    • 2018-04-01
    • 2021-12-15
    • 2016-03-28
    • 2017-01-09
    • 2017-07-18
    • 2020-08-10
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多