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

2024-03-17

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

一个解析器的示例:

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

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

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

parent:

Object {location: "020202"}

args:

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

context:

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

一些服务器代码:

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

我的根解析器:

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

Schema:

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

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

If a resolve函数是为某个字段定义的,当 GraphQL 解析该字段时,它会通过four该函数的参数:

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

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

So your getLocalDrivers查询可以返回一个数组Driver对象,并且只要Driver对象有一个name财产,name field将解析为该属性的值。

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

好的,那么根呢?

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

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

那么这里的教训是什么?

不要使用根。

严重地。将您的架构定义为对象,或者如果您想使用 GraphQL 架构语言写出架构,请使用graphql 工具 https://www.apollographql.com/docs/graphql-tools/generate-schema.html -- 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,
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Prisma 部署 Docker 错误“无法连接到服务器”

    这是我已经完成的步骤 prisma init 我在本地 不存在 中为数据库设置了 postgresql 它创建了 3 个文件 datamodel graphql docker compose yml prisma yml docker co
  • GraphQL:你能改变查询的结果吗?

    书面这个问题 https stackoverflow com questions 52318135 defining mutations in graphql via fields is this bad practice 52322818
  • Graphql 和往返。这只是ios应用程序的问题吗?

    我正在重新审视 graphql 我试图理解为什么节省往返对开发人员有好处 提出请求的费用这么贵吗 我有网络开发背景 让我们将标准 Rest api 与 graphql api 进行比较 我需要检索用户的个人信息及其朋友列表 传统的 Rest
  • GraphQL - 在查询多个突变期间如何检索先前突变的 id

    我想在同一个查询中运行多个突变 在下面的示例中 我创建了一个订单 并在创建了关于之前创建的产品记录之后 我一定有两个突变 首先 我插入订单 在输出中 我检索了 idorder 然后 我插入一个产品 这个产品 mutation createO
  • Graphql @include 带表达式

    我正在实现一个查询 该查询应该根据用户登录状态提供响应中的某些字段 具体来说 我想得到 点率 仅当字段 authenticationToken已通过并且希望避免通过 authenticated在下面的查询中 我想避免发送的原因 authen
  • 在类组件的方法中获取查询

    Apollo 客户端 2 6 3 与反应 是否可以在类组件的方法中获取数据 我正在构建一个全局搜索组件 并且我只想在键入第三个 以及每个后续 字符时才获取 数据 现在它是用 fetch api 实现的 但我想切换到 apollo 客户端和
  • Nodemon 错误:“已达到文件观察器数量的系统限制”

    我在学GraphQL https en wikipedia org wiki GraphQL我正在使用prisma binding用于 GraphQL 操作 我正面临着这个nodemon当我启动 Node js 服务器时出现错误 它给了我由
  • GraphQL java以json格式发送自定义错误

    我正在一个 graphql 应用程序中工作 我必须以 json 格式发送自定义错误对象 消息 无论它是出现在 servlet 还是服务中 预期错误响应 errorCode 400 error goes here errorMessage m
  • Auth0 - Django 和石墨烯

    我目前正在使用 Graphql 和 Django Graphene JWT 我使用 django 作为后端 所有请求均通过如下所示的令牌进行身份验证 我有一个为 graphql 创建身份验证令牌的模式 目前如下所示 class Mutati
  • 如何处理返回布尔值的 GraphQL 查询?

    需要在用户注册过程中检查电子邮件是否可用或已被占用 目标是使用 GraphQL API 服务器快速查询 并让它告诉我们电子邮件是否可用或已被占用 使用 GraphQL 处理简单布尔类型情况的一般最佳实践是什么 以下是我的想法 但我不确定这是
  • GraphQL 请求错误 - 未知参数“slug”

    我正在尝试将我的 index js 页面链接到文章模板 以使用 slug 和显示来自中间件 Drupal 站点的数据createPages 我的 index js 页面和我的页面上的数据正确显示createPages将文件路径更改为后似乎没
  • 如何在 GraphQL 服务器上启用 gzip?

    根据本文 http graphql org learn best practices 鼓励任何生产 GraphQL 服务启用 GZIP 并鼓励其客户端发送标头 接受编码 gzip 我已经在 Postman 中测试了这一点 启用或禁用 Acc
  • 连接中的不透明游标应该在不同的字段参数中保持稳定吗?

    The RANGE ADD突变需要一个edgeName以便它可以将新边插入到客户端连接中 作为其查询的一部分 它还包括cursor 问题是服务器无法知道客户端在生成边缘响应时可能将哪些参数应用于连接 这是否意味着cursor应该稳定 通常
  • GraphQL 代码中的 Javascript 循环依赖

    我是 Javascript 新手 不知道如何解决这个问题 我正在创建一个 GraphQL 服务来提供对数据库的查询 我想定义三种类型 个人 公司和关系 type Relation person Person company Company
  • graphql,当有“add”和“update”突变时如何设计输入类型?

    这是我的要求 添加 突变 每个字段 或称为标量 BookInput输入类型应该有额外的类型修饰符 验证非空值 这意味着当我添加一本书时 参数必须有title and author场 比如 title angular author noval
  • GraphQL - 根据参数返回计算类型

    Overview 简化 在我的 NodeJS 服务器中 我实现了以下 GraphQL 架构 type Item name String value Float type Query items names String Item 然后 客户
  • 可以在没有 dynamoDB 的情况下使用 AWS App-Sync

    我对 Amazon app sync 的离线和同步功能感兴趣 但我想知道它是否可以在没有 dynamoDB 作为后端的情况下使用 用 VTL 为 dynamoDB 编写的 graphQL 解析器看起来很糟糕 看来使用 mongo 后端会好得
  • Graphql 创建两个查询之间的关系。错误无法在初始化之前访问

    我有这个代码 const ProductType new GraphQLObjectType name Product fields id type GraphQLID name type GraphQLString category ty
  • 一对多关系未显示在对象放大架构定义中

    我刚开始将 amplify 与 GraphQL 结合使用 我正在设置数据库模式并在运行放大推送后自动生成函数 我想要实现但不知道如何实现的目标 我希望能够在 getUser 返回的对象中获取用户的所有连接信息 一对一和一对多关系 我希望仍然
  • graphql 中的 Console.log 解析器数据

    我正在尝试在 graphql 应用程序中 console log 解析器 graphiql 部分可以工作 我可以启动服务器并查看 graphql 仪表板 然后使用根查询在浏览器窗格中检索结果 但我无法在浏览器控制台中 console log

随机推荐