GraphQL 嵌套查询查找

Posted

技术标签:

【中文标题】GraphQL 嵌套查询查找【英文标题】:GraphQL nested query Lookup 【发布时间】:2018-06-13 20:59:21 【问题描述】:

我正在使用 graphql-tools 生成模式。此查询工作正常

query
  links(id: 1) 
    url
    resources
      type
      active
    
  

我的问题是嵌套查询的“解析器”将是什么,以便它返回 8902 id 的资源。

query
  links(id: 1) 
    url
    resources(id: 8902) 
      type
      active
    
  

代码如下:

const express = require('express');
const bodyParser = require('body-parser');
const graphqlExpress, graphiqlExpress = require('apollo-server-express');
const makeExecutableSchema = require('graphql-tools');
const _ = require('lodash');

const links = [
    
        id: 1, url: "http://bit.com/xDerS",
        resources: [
            id: 8901, type: "file", active: true, cacheable: true,
            id: 8902, type: "file", active: false, cacheable: true
        ]
    ,
    
        id: 2,
        url: "http://bit.com/aDeRe",
        resources: [id: 8903, type: "file", active: true, cacheable: true]
    
];

const typeDefs = `type Query  links(id: Int, ): [Link] 
  type Link  id: Int, url: String, resources(id: Int): [Resource] 
  type Resource id: Int, type: String, active: Boolean, cacheable: Boolean`;

const resolvers = 
    Query: 
        links: (root, arg, context) => 
            return arg == null ? links : _.filter(links, id: arg.id);
        

    
;

const schema = makeExecutableSchema(typeDefs, resolvers);
const app = express();
app.use('/graphql', bodyParser.json(), graphqlExpress(schema));
app.use('/graphiql', graphiqlExpress(endpointURL: '/graphql'));
app.listen(3000, () => console.log('Go to http://localhost:3000/graphiql to run queries!'));

【问题讨论】:

另外,您可能需要修改 links 的解析器。如果没有传入任何参数,则解析器的第二个参数 (arg) 将是一个空对象 ( ),因此它永远不会为空。您应该检查是否定义了 arg.id。 【参考方案1】:

您可以为Link 类型的resources 字段添加解析器,如下所示:

Query: 
  // Query fields

Link: 
  resources: ( resources ,  id ) => id
    ? _.filter(resources,  id )
    : resources

关键区别在于,我们不是从某个来源过滤数据,而是查看父字段(在这种情况下,links 字段中的每个 Link)解析为什么。

传递给解析器的第一个参数是表示该信息的对象。对于***类型,如QueryMutation,这称为根值,可以为整个模式定义,但实际上应该很少使用(几乎任何你可以放入根值的东西都应该放在里面而是您的上下文)。对于任何其他类型,第一个参数将始终反映父字段解析为的任何内容。

【讨论】:

Daniel,你有这个实现文档的链接吗?

以上是关于GraphQL 嵌套查询查找的主要内容,如果未能解决你的问题,请参考以下文章

graphql 在嵌套查询的父或父参数上使用嵌套查询参数

为啥我的 graphql 嵌套查询返回 null?

GraphQL 嵌套查询返回 null

嵌套查询 GraphQl

GraphQL 简单嵌套查询返回空字段

嵌套查询到未知级别 GraphQL [重复]