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

Posted

技术标签:

【中文标题】为啥我的 graphql 嵌套查询返回 null?【英文标题】:Why is my graphql nested query returning null?为什么我的 graphql 嵌套查询返回 null? 【发布时间】:2017-10-01 22:20:31 【问题描述】:

我是 graphql 新手,遇到嵌套查询问题,需要帮助传递 id 来识别关系。

查询

您可以在上面看到PERFORMED_FOR_Affiliation 为空,尽管它在架构中定义为Affiliation 类型。

type Query 
      affiliations(affn_id: ID!): [Affiliation]
      performances(pfrm_id: ID!): [Performance]
      PERFORMED_FOR_Affiliation(affn_id: ID!): Affiliation
      Performance_PERFORMED_FOR(pfrm_id: ID!): [Performance]
    

PERFORMED_FOR_Affiliation 查询类似于affiliations 查询,只是关系应该只返回 1 个从属关系(具有匹配的 uid)。

我认为 affn_id 没有正确传递,并且不确定如何正确传递。 PERFORMED_FOR_Affiliation 是否需要自己的架构?

架构

type Performance 
    pfrm_id: ID!
    mark: Int
    affn_id: ID!
    PERFORMED_FOR_Affiliation: Affiliation


type Affiliation 
    affn_id: ID!
    name: String
    Performance_PERFORMED_FOR: [Performance]

我见过一些使用“节点”和“边缘”类型​​的模式。由于我有许多其他关系,这是定义图表的更好方法吗?

解析器

import performances from './mockData/performances.js';
import affiliations from './mockData/affiliations.js';

export const resolvers = 
  Query: 
    affiliations: (root, args) => 
      return affiliations;
    ,
    performances: (root, args) => 
      return performances;
    ,
    PERFORMED_FOR_Affiliation: (root, args) => 
      return affiliations;
    ,
    Performance_PERFORMED_FOR: (root, args) => 
      return performances;
    ,
  ,
;

模拟数据

//affiliations.js
module.exports = [
  
    "affn_id": "43700F3BE17145399924AC176EACBEF4",
    "name": "Richmond Senior"
  ,
  
    "affn_id": "8BDE709AC757416082950B1BEED0CE0A",
    "name": "Cedar City"
  ,
  
    "affn_id": "123D201BB17545E3B6ECCCCB5FC61FA3",
    "name": "Delta"
  
]

// performances.js
module.exports = [
  
    pfrm_id: "6BD41C6B1C4B43D199DE42A4A408DF1A",
    mark: 1270000,
    affn_id: "43700F3BE17145399924AC176EACBEF4",
  ,
  
    pfrm_id: "EA2FBC6AB891460EA557F5B60984AD8A",
    mark: 1422400,
    affn_id: "8BDE709AC757416082950B1BEED0CE0A",
  ,
  
    pfrm_id: "54A6EEB9552C49AC9F7A87E68AC272A2",
    mark: 1422400,
    affn_id: "123D201BB17545E3B6ECCCCB5FC61FA3",
  ,
]

【问题讨论】:

看起来正确。能否提供查询解析器? 我假设父查询将从隶属关系数组中过滤掉匹配的affn_id。听起来我可能返回了错误的查询? 是的,我认为您必须明确找到与affn_id 的隶属关系。 我应该在解析器、对象模式还是在 graphiql 查询中实现它?我尝试在我的文件中添加PERFORMED_FOR_Affiliation(affn_id: ID, pfrm_id: ID): Affiliation 并查询,但没有成功。 是否打算在 Performance 中 affn_id 的类型为 String 而在 Affiliation 中的类型为 ID?您还可以提供./mockData/affiliations.js 中的内容吗? 【参考方案1】:

是的,你应该在你的解析器中实现它。我猜你会在后台有一个数据库,例如mongoose:

您查询演出,其中您populate隶属关系

performances: (root, args) => 
  return new Promise((resolve, reject) => 
    performanceModel.find() // find all performances
      .populate("PERFORMED_FOR_Affiliation") // add values for affiliates
      .exec((error, performances) => 
        if (!error) 
          resolve(performances); // resolve correct object
         else 
          reject(error);
        
      );
  );
,

【讨论】:

谢谢@Locco0_0 我确实打算使用猫鼬切换到我的数据库,但目前只使用原始数组进行测试。

以上是关于为啥我的 graphql 嵌套查询返回 null?的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL 嵌套查询返回 null

为啥 GraphQL 查询返回 null?

为啥 GraphQL 查询返回 null?

为啥 GraphQL 查询返回 null?

为啥 GraphQL 查询返回 null?

对 GraphQL 中嵌套类型的深度查询返回 NULL