的类型必须为Output

的类型必须为Output

本文介绍了GraphQL [graphql js]循环依赖项:*的类型必须为Output Type,但得到:[object Object]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

编辑

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


原始问题

我相信这个问题与循环依赖有关.我昨晚度过了更好的时光,今天尝试了所有可以在网上找到的内容,但似乎无济于事.

我尝试过的事情:

  • fields道具转换为返回字段对象的函数
  • 将相关字段(在props字段之内)转换为返回类型的函数
  • 结合以上两种方法
  • 最后以require语句代替使用引用类型的字段(似乎不正确,并且短绒棉对此项进行了中风)

这是文件结构:

下面是代码:

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;
解决方案

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

仅通过将GraphQLObjectType指定为const的类型就可以使它工作.

类似的东西:

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

现在它可以正常工作了.

EDIT

added my solution as an answer


ORIGINAL QUESTION

i believe this issue has to do with circular dependencies. i spent the better half of last night and today trying everything i could find online but nothing seems to work.

what i have tried:

  • convert the fields prop to a function that returns a field object
  • convert the relating fields (within the fields prop) into functions that return the type
  • combining the two approaches above
  • finally ending with require statements in place of the fields that use the reference type (does not seem correct and the linter had a stroke over this one)

here is the file structure:

here is the code:

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;
解决方案

I had a similar issue using Typescript, and I kinda like the javascript based Type definition better so didn't change to GraphQL SDL.

I got it to work just by specifying the type of const to GraphQLObjectType.

Something like:

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

Now it works without a problem.

这篇关于GraphQL [graphql js]循环依赖项:*的类型必须为Output Type,但得到:[object Object]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-24 07:11