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 }\nRun Code Online (Sandbox Code Playgroud)\n\n我已经编写了文档中出现的参数名称:http://graphql.org/learn/execution/
\n\n但是当我调试和检查对象时,似乎 args 对象是第一个,上下文是第二个,父/根是第三个。
\n\n家长:
\n\nObject {location: "020202"}\nRun Code Online (Sandbox Code Playgroud)\n\n参数:
\n\nIncomingMessage {_readableState: ReadableState, readable: false, domain: null, \xe2\x80\xa6}\nRun Code Online (Sandbox Code Playgroud)\n\n语境:
\n\nObject {fieldName: "getLocalDrivers", fieldNodes: ....\nRun Code Online (Sandbox Code Playgroud)\n\n一些服务器代码:
\n\napp.use(\n "/graphql",\n graphqlHTTP({\n schema,\n graphiql: true,\n rootValue: rootResolver\n })\n);\nRun Code Online (Sandbox Code Playgroud)\n\n我的根解析器:
\n\nvar rootResolver = {\n getLocalDrivers: async (obj, args, ctx) => {\n console.log(ctx);\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n架构:
\n\nvar { 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 }`);\nRun Code Online (Sandbox Code Playgroud)\n
如果resolve为某个字段定义了一个函数,那么当 GraphQL 解析该字段时,它将向该函数传递四个参数:
objor root)如果特定字段缺少解析函数,GraphQL 将使用默认解析器,该解析器仅在父字段上搜索属性并在找到时使用该属性。
因此,您的getLocalDrivers查询可以返回一个对象数组Driver,只要该Driver对象具有name属性,该name 字段就会解析为该属性的值。
巧合的是,name该Driver对象的属性也可以是一个函数。在这种情况下,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)
| 归档时间: |
|
| 查看次数: |
2562 次 |
| 最近记录: |