【问题标题】:graphql - resolver root/parent property is nullgraphql - 解析器根/父属性为空
【发布时间】:2019-07-20 09:45:54
【问题描述】:

鉴于此架构:

const typeDefs = gql`type Asset {
  id: ID!
  name: String!
  ScanProfiles: [ScanProfile]
}

type ScanProfile {
  id: ID!
  name: String!
  Assets: [Asset]
}

type Query {
  Asset(id: ID!): Asset
  ScanProfile(id: ID!): Asset
}`;

// Some generic resolvers...
const resolvers = {
  Asset: (root, args, context) => context.get('asset', args),
  ScanProfile: (root, args, context) => context.get('scanProfile, args),
  Query: {
    Asset: (root, args, context) => context.get('asset', args),
    ScanProfile: (root, args, context) => context.get('scanProfile', args)
  }
};

const schema = makeExecutableSchema({typeDefs, resolvers

const joinResolvers = {
  Asset: {
    ScanProfiles: (root, args, context) => { 
      console.log(root.ScanProfiles);
      return root.ScanProfiles.map(id => context.get('scanProfile', {id});
    }
  },
  ScanProfiles: {
    Assets: (root, args, context) => {
      console.log(root.id);
      return context.filter('asset', {ScanProfiles: ({ScanProfiles}) => ScanProfiles.includes(root.id)}); 
    }
  }
};

addResolveFunctionsToSchema({ schema, resolvers: joinResolvers });

我希望 context.get 对于给定的 id 返回这些形状:

// Asset
{
  id: '1234',
  name: 'abcd',
  ScanProfiles: ['5678', '5679']
}
//ScanProfile
{
  id: '5678',
  name: 'efgh'
}

控制台正在为 Asset.ScanProfiles 返回 [null]

根解析器将字段作为字符串数组返回,但是当根随后传递给joinResolvers 时,这些文件为空。我假设是因为它们与定义的 typeDefs 不匹配。

要解决这个问题,我必须单独调用以重新获取父级,然后为子级提取存储的值。

我是否错误地定义了我的类型?我的解析器结构错了吗?

【问题讨论】:

    标签: graphql graphql-tools


    【解决方案1】:

    问题在于定义类型。

    当父级解析时,它期望子级是一个 Object 数组,但交付的是一个字符串数组。因此,类型验证会根据结果 1 here 中定义的“冒泡”返回一个空数组。

    在 github 上有一个公开讨论允许unions scalar types

    【讨论】:

      猜你喜欢
      • 2021-04-17
      • 2017-01-07
      • 2017-05-02
      • 2019-07-14
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      相关资源
      最近更新 更多