GraphQL [graphql JS]循环依赖:类型*必须是输出类型,但得到:[对象的对象](Gr

2019-10-28 13:02发布

编辑

加入我的解决方案作为一个答案


原来的问题

我相信这个问题有循环依赖做。 我花了一半好,昨晚和今天乱投医我可以在网上找到,但似乎没有任何工作。

我曾尝试:

  • 转换fields道具,返回一个字段对象的功能
  • 转换有关的字段(字段内托)到该返回类型功能
  • 结合上述两种方法
  • 终于有需要的地方使用引用类型的字段的语句结尾(似乎不正确和棉短绒有超过这一个行程)

这里是文件结构:

这里是代码:

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;

Answer 1:

我不能得到这个任何地方的任何帮助。 万一有人跑进此错误消息下面是我来解决它的步骤:

  1. 转自graphql-expressapollo-server-express (这不是必要的,但我发现阿波罗成为一个更强大的库)
  2. 用下面的包: graphql graphql-import graphql-tools
  3. 从基于JavaScript类型DEFS切换到使用GraphQL SDL( .graphql )文件类型
  4. 第3步就是纠正一个一对多(和M2M)的关系相关联的圆形进口问题

我致力于从旧代码倾销创建新的重构的每一步。 我添加了大量的笔记和明确的命名,这样应该可以作为一个指南。

你可以看到通过下面的链接提交历史的diff。 所有的工作,直到最后几次提交的是在中完成graphql/目录。 如果你点击的标题提交它会告诉你的差异,所以你可以按照重构

  • 最后重构一个一对多的关系,采用阿波罗和GraphQL SDL类型与DEFS
  • 提交历史,在开始Scrapped old GraphQL setup

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

在这种情况下的关系是:连接属于一个所有者(用户通过owner_id)和伴侣(用户通过PARTNER_ID)。

我们会将从这里的代码库被移动,但我锁定的分支和的人谁需要一个引导的提交。



Answer 2:

我不得不使用打字稿类似的问题,我还挺喜欢的基于JavaScript类型定义更好,所以没有改变到GraphQL SDL。

我把它通过指定为const类型GraphQLObjectType只是工作。

就像是:

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

现在,它的工作原理没有问题。



文章来源: GraphQL [graphql js] circular dependencies: The type of * must be Output Type but got: [object Object]