【问题标题】:GraphQL [graphql js] circular dependencies: The type of * must be Output Type but got: [object Object]GraphQL [graphql js] 循环依赖: * 的类型必须是 Output Type 但得到: [object Object]
【发布时间】:2018-10-14 03:13:33
【问题描述】:

编辑

添加我的解决方案作为答案


原始问题

我相信这个问题与循环依赖有关。我昨晚花了大半天,今天尝试了我在网上可以找到的所有东西,但似乎没有任何效果。

我尝试过的:

  • fields prop 转换为返回字段对象的函数
  • 将相关字段(在 fields 属性内)转换为返回类型的函数
  • 结合上述两种方法
  • 最后以 require 语句代替使用引用类型的字段结束(似乎不正确,linter 对此有笔画)

这是文件结构:

代码如下:

userType.js

const graphql = require('graphql');
const Connection = require('../../db/connection');
const ConnectionType = require('../connection/connectionType');

const { GraphQLObjectType, GraphQLList, GraphQLString, GraphQLID } = graphql;

const UserType = new GraphQLObjectType({
  name: 'User',
  fields: () => ({
    id: { type: GraphQLID },
    username: { type: GraphQLString },
    email: { type: GraphQLString },
    created: {
      type: GraphQLList(ConnectionType),
      resolve: ({ id }) => Connection.find({ owner: id }),
    },
    joined: {
      type: GraphQLList(ConnectionType),
      resolve: ({ id }) => Connection.find({ partner: id }),
    },
  }),
});

module.exports = UserType;

connectionType.js

const graphql = require('graphql');
const User = require('../../db/user');
const UserType = require('../user/userType');

const { GraphQLObjectType, GraphQLString, GraphQLID, GraphQLInt } = graphql;

const ConnectionType = new GraphQLObjectType({
  name: 'Connection',
  fields: () => ({
    id: { type: GraphQLID },
    owner: {
      type: UserType,
      resolve: ({ owner }) => User.findById(owner),
    },
    partner: {
      type: UserType,
      resolve: ({ partner }) => User.findById(partner),
    },
    title: { type: GraphQLString },
    description: { type: GraphQLString },
    timestamp: { type: GraphQLString },
    lifespan: { type: GraphQLInt },
  }),
});

module.exports = ConnectionType;

【问题讨论】:

  • 你的类型看起来不错,除了 GraphQLList(ConnectionType) 应该是 new GraphQLList(ConnectionType) 因为那是一个类
  • 感谢我在发布此内容后尝试了一下。它都不起作用,但对我来说看起来是正确的。我不明白
  • 你从问题标题中究竟是从哪里得到这个错误的?
  • 加载中的 graphiql 客户端
  • 老实说无法判断问题可能是什么。你能在一个较小的独立示例上重现这个吗?

标签: graphql-js circular-reference express-graphql


【解决方案1】:

我无法在任何地方获得任何帮助。万一有人遇到此错误消息,这是我修复它所采取的步骤:

  1. graphql-express 切换到 apollo-server-express(这不是必需的,但我发现 apollo 是一个更强大的库)
  2. 使用了以下包:graphql graphql-import graphql-tools
  3. 从基于 javascript 的类型定义切换到使用 GraphQL SDL (.graphql) 文件类型
  4. 第 3 步纠正了与一对多(和 m2m)关系相关的循环导入问题

我提交了重构的每一步,从转储旧代码到创建新代码。我添加了大量的注释和明确的命名,以便它可以用作指南。

您可以通过以下链接查看提交历史记录差异。直到最后几次提交之前的所有工作都在 graphql/ 目录中完成。如果您单击提交的标题,它将向您显示差异,以便您可以遵循重构

重构之后,我现在有了更清晰的解析器、更好的目录模式,最重要的是,用户和连接之间的一对多关系功能齐全! ...只花了我该死的一天。

这种情况下的关系是: 连接属于所有者(用户通过 owner_id)和合作伙伴(用户通过 partner_id)。

我们将从这里开始使用代码库,但我为任何需要指导的人锁定了分支及其提交。

【讨论】:

  • 是的,切换到 sdl 类型的 defs 可能是最简单的解决方案。我现在真的很喜欢你的应用结构。
【解决方案2】:

我在使用 Typescript 时遇到了类似的问题,我更喜欢基于 javascript 的类型定义,因此没有更改为 GraphQL SDL。

我只需将 const 的类型指定为 GraphQLObjectType 即可。

类似:

export const UserType: GraphQLObjectType = new GraphQLObjectType({
  name: 'UserType',
  fields: () => ({
    .....
  })
}

现在它可以正常工作了。

【讨论】:

  • 这是有效的语法吗?看起来像一个打字稿导出。
  • 是的,我忘了提到它在 TypeScript 中。
  • 您应该使用该信息更新您的答案。我问的问题没有指定语言,所以它是一个有效的答案。但对于遇到这篇文章的人来说,值得澄清一下。
猜你喜欢
  • 2017-03-07
  • 2016-11-09
  • 2018-03-28
  • 2018-11-27
  • 2018-06-30
  • 2018-01-30
  • 2019-12-23
  • 2017-07-20
  • 2019-09-19
相关资源
最近更新 更多