achakravarty
achakravarty

Reputation: 408

How to return nested objects in GraphQL schema language

I was going through the documentation for GraphQl and realized that the new Schema Langugage supports only default resolvers. Is there a way I can add custom resolvers while using the new Schema Language?

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

This is the schema that I have defined. I would like to add some behavior here that would allow me to parse the address object and return a concatenated string value.

Upvotes: 3

Views: 3764

Answers (2)

achakravarty
achakravarty

Reputation: 408

As mentioned by HagaiCo and in this github issue, the right way would be to go with graphql-tools.

It has a function called makeExecutableSchema, which takes a schema and resolve functions, and then returns an executable schema

Upvotes: 2

HagaiCo
HagaiCo

Reputation: 706

It seems like you have a confusion in here, since you defined that address is String but you send a dictionary to resolve it.

what you can do, is to define a scalar address type: scalar AddressType if you use buildSchema and then attach parse functions to it. (or use graphql-tools to do it easily)

or build the type from scratch like shown in 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;
}

and then you can parse the dictionary into a string (parseValue) and otherwise

Upvotes: 0

Related Questions