【问题标题】:How to return nested objects in GraphQL schema language如何在 GraphQL 模式语言中返回嵌套对象
【发布时间】:2017-01-29 15:40:37
【问题描述】:

我正在浏览 GraphQl 的文档,并意识到新的 Schema 语言只支持默认解析器。有没有办法在使用新的架构语言时添加自定义解析器?

let userObj = {
  id: 1,
  name: "A",
  homeAddress: {
    line1: "Line1",
    line2: "Line2",
    city: "City"
  }
};

let schema = buildSchema(`
  type Query {
    user(id: ID): User
  }

  type User {
    id: ID
    name: String
    address: String 
  }
`);

//I would like User.address to be resolved from the fields in the json response eg. address = Line1, Line2, City

这是我定义的架构。我想在这里添加一些行为,允许我解析地址对象并返回一个串联的字符串值。

【问题讨论】:

    标签: graphql graphql-js


    【解决方案1】:

    正如 HagaiCo 和 github issue 所提到的,正确的方法是使用 graphql-tools。

    它有一个名为ma​​keExecutableSchema的函数,它接受一个模式和解析函数,然后返回一个可执行模式

    【讨论】:

      【解决方案2】:

      您在这里似乎有些困惑,因为您将地址定义为字符串,但您发送了字典来解决它。

      你可以做的是定义一个标量地址类型: scalar AddressType 如果您使用 buildSchema 然后将解析函数附加到它。 (或使用graphql-tools 轻松完成)

      或从头开始构建类型,如the official documentations 所示:

      var OddType = new GraphQLScalarType({
        name: 'Odd',
        serialize: oddValue,
        parseValue: oddValue,
        parseLiteral(ast) {
          if (ast.kind === Kind.INT) {
            return oddValue(parseInt(ast.value, 10));
          }
          return null;
        }
      });
      
      function oddValue(value) {
        return value % 2 === 1 ? value : null;
      }
      

      然后你可以将字典解析成字符串(parseValue),否则

      【讨论】:

      • 抱歉。我通过将对象中的“地址”字段重命名为“homeAddress”来更新问题。所以我希望那个对象解析成一个字符串。我的问题更多是关于如何使用新的模式语言来实现这一目标
      • 新的 buildSchema 仍然需要将解析器附加到架构中,它会定义骨架但它仍然需要知道如何解析/解析/解析字段
      • 是的,我知道。只是想知道是否有办法使用新的 buildSchema 来实现。我喜欢新语法,因为它看起来更干净。
      • 据我所知,您需要迭代架构上的字段并更新其解析/解析/等。您可以在此处查看示例:github.com/apollostack/graphql-tools/blob/master/src/… 或者您可以使用 graphql-而是使用工具,它会使用该功能为您完成 :)
      • 也查看了那个 repo。只有在没有其他解决方案的情况下,才会沿着这些路线走。支持上述评论。
      猜你喜欢
      • 2019-06-14
      • 2021-04-21
      • 2019-12-21
      • 2021-11-27
      • 1970-01-01
      • 2021-12-18
      • 2019-05-25
      • 2017-10-07
      • 1970-01-01
      相关资源
      最近更新 更多