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

Hyl*_*lle 5 graphql graphql-js express-graphql

我想知道为什么我的参数似乎在我的 GraphQL 解析器中发生了变化。我正在使用express-graphql。

\n\n

一个解析器的示例:

\n\n
  getLocalDrivers: async (parent, args, ctx) => {\n    console.log(ctx);\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

家长:

\n\n
Object {location: "020202"}\n
Run Code Online (Sandbox Code Playgroud)\n\n

参数:

\n\n
IncomingMessage {_readableState: ReadableState, readable: false, domain: null, \xe2\x80\xa6}\n
Run Code Online (Sandbox Code Playgroud)\n\n

语境:

\n\n
Object {fieldName: "getLocalDrivers", fieldNodes: ....\n
Run Code Online (Sandbox Code Playgroud)\n\n

一些服务器代码:

\n\n
app.use(\n  "/graphql",\n  graphqlHTTP({\n    schema,\n    graphiql: true,\n    rootValue: rootResolver\n  })\n);\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的根解析器:

\n\n
var rootResolver = {\n     getLocalDrivers: async (obj, args, ctx) => {\n       console.log(ctx);\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

架构:

\n\n
var { buildSchema } = require("graphql");\nvar schema = buildSchema(`\n  type Query {\n    getLocalDrivers(location: String): [Driver]\n  }\n\n  type Driver {\n    name: String\n    location: String    \n  }`);\n
Run Code Online (Sandbox Code Playgroud)\n

Dan*_*den 4

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

  1. 父字段解析为的值(通常称为objor root
  2. 该字段的参数
  3. 上下文
  4. 描述整个 GraphQL 请求的信息对象

如果特定字段缺少解析函数,GraphQL 将使用默认解析器,该解析器仅在父字段上搜索属性并在找到时使用该属性。

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

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

好的,那么根呢?

根对象只是充当查询和突变的“父字段值”的对象,这些字段与其他所有字段一样。

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

那么这里的教训是什么?

不要使用根。

严重地。将您的模式定义为对象,或者如果您想使用 GraphQL 模式语言编写模式,请使用graphql-tools ——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,
})
Run Code Online (Sandbox Code Playgroud)