Dan
Dan

Reputation: 760

How to access query path properties in a resolver? GraphQL

I have a database with the following structure.

Graph Database I'm writing a GraphQL resolver for the bottom-most node (the "rows" node).

As the image shows, each "rows" node corresponds to a specific path. (Company)->(DB)->(Table)->(rows)

A Query would be of the form:

{
  Company(name: "Google") {
    Database(name: "accounts") {
      Table(name: "users") {
        rows
      }
    }
  }
}

Question: How can I include/access Company.name, Database.name, Table.name information in the rows resolver so that I can determine which rows node to return?

In other words: I know I can access Table.name using parent.name, but is there a way to get parent.parent.name or parent.parent.parent.name?

If there isn't a way to access ancestor properties, should I use arguments or context to pass these properties manually into the rows resolver?

Note: I can't use the neo4j-graphql-js package.

Note: This is the first simple example I thought of and I understand there are structural problems with organizing data this way, but the question still stands.

Upvotes: 2

Views: 1544

Answers (1)

Daniel Rearden
Daniel Rearden

Reputation: 84687

You can extract the path from the GraphQLResolveInfo object passed to the resolver:

const { responsePathAsArray } = require('graphql')

function resolver (parent, args, context, info) {
  responsePathAsArray(info.path)
}

This returns an array like ['google', 'accounts', 0, 'user']. However, you can also pass arbitrary data from parent resolver to child resolver.

function accountResolver (parent, args, context, info) {
  // Assuming we already have some value at parent.account and want to return that
  return {
    ...parent.account,
    message: 'It\'s a secret!',
  }
}

function userResolver (parent, args, context, info) {
  console.log(parent.message) // prints "It's a secret!"
}

Unless message matches some field name, it won't ever actually appear in your response.

Upvotes: 5

Related Questions