首页 > 解决方案 > 如何访问解析器中的查询路径属性?GraphQL

问题描述

我有一个具有以下结构的数据库。

图数据库 我正在为最底部的节点(“行”节点)编写一个 GraphQL 解析器。

如图所示,每个“行”节点对应一个特定路径。(公司)->(数据库)->(表)->(行)

查询将采用以下形式:

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

问题:如何在解析器中包含/访问Company.name, Database.name,Table.name信息rows以便确定rows要返回的节点?

换句话说:我知道我可以访问Table.nameusing parent.name,但是有没有办法获得parent.parent.nameor parent.parent.parent.name

如果无法访问祖先属性,我应该使用参数或上下文将这些属性手动传递到rows解析器吗?

注意:我不能使用 neo4j-graphql-js 包。

注意:这是我想到的第一个简单示例,我知道以这种方式组织数据存在结构性问题,但问题仍然存在。

标签: graphql

解决方案


您可以从传递给解析器的 GraphQLResolveInfo 对象中提取路径:

const { responsePathAsArray } = require('graphql')

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

这将返回一个数组,如['google', 'accounts', 0, 'user']. 但是,您也可以将任意数据从父解析器传递到子解析器。

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!"
}

除非message与某些字段名称匹配,否则它实际上不会出现在您的响应中。


推荐阅读