0

编辑

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


原始问题

我相信这个问题与循环依赖有关。我昨晚度过了大部分时间,今天尝试了我能在网上找到的所有东西,但似乎没有任何效果。

我试过的:

  • fieldsprop 转换为返回字段对象的函数
  • 将相关字段(在 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;
4

2 回答 2

2

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

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

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

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

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

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

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

于 2018-05-04T03:56:19.263 回答
1

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

我只是通过将 const 的类型指定为 GraphQLObjectType 来使其工作。

就像是:

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

现在它可以正常工作了。

于 2018-05-09T09:16:45.873 回答