当前位置: 首页 > 知识库问答 >
问题:

GraphQL解析器参数的顺序错误(根、参数、上下文)

步德宇
2023-03-14

我想知道为什么我的论点似乎在我的GraphQL解析器内切换。我用的是快速图形。

一个解析器的示例:

  getLocalDrivers: async (parent, args, ctx) => {
    console.log(ctx);
  }

我已经写了文件中出现的参数名称:http://graphql.org/learn/execution/

但当我调试和检查对象时,args对象似乎是第一个,上下文是第二个,父/根是第三个。

家长:

Object {location: "020202"}

args:

IncomingMessage {_readableState: ReadableState, readable: false, domain: null, …}

上下文:

Object {fieldName: "getLocalDrivers", fieldNodes: ....

某些服务器代码:

app.use(
  "/graphql",
  graphqlHTTP({
    schema,
    graphiql: true,
    rootValue: rootResolver
  })
);

我的根解析器:

var rootResolver = {
     getLocalDrivers: async (obj, args, ctx) => {
       console.log(ctx);
  }
}

模式:

var { buildSchema } = require("graphql");
var schema = buildSchema(`
  type Query {
    getLocalDrivers(location: String): [Driver]
  }

  type Driver {
    name: String
    location: String    
  }`);

共有1个答案

淳于煌
2023-03-14

如果为一个字段定义了一个解析函数,当GraphQL解析该字段时,它将向该函数传递四个参数:

  1. 父字段解析到的值(通常称为objroot
  2. 该领域的论点
  3. 上下文
  4. 一个描述整个GraphQL请求的info对象

如果特定字段缺少解析函数,GraphQL将使用默认的解析程序,该解析程序只搜索父字段上的属性,如果找到该属性,则使用该属性。

因此,您的getLocalDrivers查询可以返回Driver对象的数组,只要Driver对象具有name属性,那么name字段将解析为该属性的值。

巧合的是,Driver对象上的name属性也可以是一个函数。在这种情况下,GraphQL将调用该函数以获取其返回值。与解析器非常相似,GraphQL将一些信息作为参数传递给这个函数,即1)参数,2)上下文和3)信息对象。以这种方式解析字段时,“obj”参数将被忽略。

好的,那么根呢?

根对象只是作为“父字段值”的对象,它被赋予查询和突变,这些字段与其他所有字段一样。

因此,如果您还没有为getLocalDrivers定义解析函数(例如,因为您使用BuildQuery编译了您的模式),GraphQL将使用默认的解析程序,并使用您传入的根对象作为父字段值。它看到一个getLocalDrivers,但是如上所述,因为这是一个函数,所以它用上述三个参数调用该函数。

那么这里的教训是什么?

不要使用root。

认真地将模式定义为对象,或者如果要使用GraphQL模式语言编写模式,请使用GraphQL工具--makeExecutableSchema使处理解析程序更加容易。

const typeDefs = `
  type Query {
    getLocalDrivers(location: String): [Driver]
  }

  type Driver {
    name: String
    location: String    
  }
`
const resolvers = {
  Query: {
    getLocalDrivers: (obj, args, ctx) => {
       console.log({obj, args, ctx})
    }
  }
}
const schema = makeExecutableSchema({
  typeDefs,
  resolvers,
})
 类似资料:
  • 基本上,我在Spring Boot中向控制器发送两个参数,一个是字符串,另一个是文件。在操作中,当我首先接收文件,然后接收字符串时,如下所示 一切都很好,我能够正确地访问字符串和文件。 但是当我改变参数的顺序时,就像这样 我研究了很多,但不能理解这种行为。

  • 匹配可以用来解析简单的参数: use std::env; fn increase(number: i32) { println!("{}", number + 1); } fn decrease(number: i32) { println!("{}", number - 1); } fn help() { println!("usage: match_args <stri

  • 我已经看到了几个来源描述(根,args,上下文,信息)参数的解析器,但我仍然在寻找真正的留档的解析器。有一些博客文章提到了解析器的论点: prisma博客-2017年2月-GraphQL模式,TypeDefs 我知道,已经通过在上构建了,并且似乎在<--plhd中记录了这些参数根字段 此外,在的文档在这里最适用吗? 这些参数似乎不是GraphQL规范的一部分。 在哪里是真正的留档参数到解析器?如果

  • 我正在这个名为Wertik JShttps://github.com/ilyaskarim/wertik-js库上工作,以使GraphQL Rest API更容易,在解析器中,当我控制台日志时,它显示未定义。对于每个模块,我都创建了动态解析器,让使用这个库的开发人员更容易。 行:https://github.com/ilyaskarim/wertik-js/blob/ec813f49a14ddd6

  • 问题内容: 和!和有什么不一样? 问题答案: 和是存储在web.xml文件中的静态参数。如果您有不经常更改的数据,则可以将其存储在其中之一中。 如果要存储限于 特定servlet范围的 特定数据,则可以使用。内部声明的任何内容仅对该 特定servlet 才可访问 。init-param 在标记内声明。 您可以按以下方式在servlet中访问这些参数: 如果要存储 整个应用程序 通用的数据,并且该数

  • 问题内容: 显然,请求参数的顺序未保留在Tomcat Servlet容器中(对于Google,似乎其他容器也存在相同的问题)。 这似乎是非常错误的。 如何从HttpServletRequest恢复请求参数的实际顺序? *对于那些认为请求参数顺序无关紧要的人来说, *编辑 BTW之间是有区别的: 和 因此,顺序对于重复的请求参数确实很重要(幸运的是Java确实处理了此权利)。 问题答案: 通常,您不