【问题标题】:What does GraphQL do with the return value from a resolver?GraphQL 如何处理解析器的返回值?
【发布时间】:2022-05-09 07:55:47
【问题描述】:

我最近开始学习 GraphQL,发现了一个我无法解释的情况。

举个例子

var {ApolloServer, gql} = require("apollo-server")

const typeDefs = gql`
    type Query {
        test: type1!
    }
    type type1 {
        value: String!
    }
`;

const resolvers = {
    Query: {
        test: (parent) => {
            console.log(parent)
            return "How does my query still work?!"
        }

    },
    type1: {
        value: (parent) => {
            console.log(parent)
            return "hello!"
        }

    }
}

const server = new ApolloServer({ typeDefs, resolvers })
server.listen(8080).then(({url}) => console.log(`server stated on ${url}`))

在正常情况下,GraphQL 会从外向内解析查询,并将使用它对给定字段的最具体的解析器,直到所有字段都被解析。

我对这个示例感到困惑的是,我从顶级解析器返回的字符串到底发生了什么。

这个查询

query {
    test {
        value
  }
}

产生结果

{
  "data": {
    "test": {
      "value": "hello!"
    }
  }
}

鉴于上面的示例,我完全希望我的 GraphQL 服务器会抛出错误,因为我的顶级解析器返回 String 而不是架构要求的 type1。

我的问题基本上是,我的服务器对解析器返回的值做了什么?显然,如果我在我的顶级解析器中返回 String,则必须发生相当大的事情才能将其转换为查询响应的 Object。

【问题讨论】:

  • @xadm 我明天试试。在该评论告诉我之后,我尝试记录 args 并且几乎没有说明情况。 args 将是一个空对象,因为没有参数被传递到查询中。除非我完全误解了 GraphQL 的实现方式,否则您需要更具体一点。
  • stackoverflow.com/q/66114816/6124657 ... 搜索一些关于“如何工作”的教程
  • @xadm 恕我直言,这条评论非常无益。如果您的目标是真正帮助我理解这个概念甚至回答我的问题,那么您应该花两秒钟以上的时间来实际创建答案。我在这里运行的代码非常简单,您可以自己运行它,甚至对其进行必要的更改以说明您要向我展示的任何内容。告诉正在询问有关特定工具的特定问题的人“只看一些教程”是您可能提供的最无用的建议。
  • @xadm 如果我觉得单独看教程可以真正回答我的问题,那么我会很乐意这样做,但是已经观看了数小时的 GraphQL 教程,我现在处于一个'我非常有信心它不会导致这个特定问题的答案。如果您无法提供实际答案,甚至无法在评论中解释您的意思,那么您发表评论毫无意义。
  • 记录了什么?服务器期望什么?它是如何相关的?登录info

标签: javascript graphql apollo-server


【解决方案1】:

我今天遇到了同样的事情。如果您可以为特定类型定义返回类似字符串的任何内容,我不明白提供返回类型的必要性是什么?

因此,如果我看到 REST API 是如何完成的,那么我可以认为返回类型是针对 API 文档和使用它的应用程序,这在 HTTP 内容类型标头中有所暗示。这告诉您一个示例,返回类型是“应用程序/json”类型,但不是模式 - 也许它有不同的标头?或者应用程序可以从某种 API 文档(如 Swagger)中获取它。

来自https://swagger.io/docs/specification/describing-responses/的有用的Swagger doc sn-p

paths:
  /users:
    get:
      summary: Get all users
      responses:
        '200':
          description: A list of users
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ArrayOfUsers'
            application/xml:
              schema:
                $ref: '#/components/schemas/ArrayOfUsers'
            text/plain:
              schema:
                type: string

PS:对网络域非常陌生。请让我知道任何不正确的假设。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-01
    • 2019-11-14
    • 2021-03-01
    • 2018-11-28
    • 2020-03-04
    • 2019-10-01
    • 2023-03-06
    • 2018-02-13
    相关资源
    最近更新 更多