2017-10-17 77 views
0

我对graphql非常新,我正在玩一个简单的案例,不能使它的工作,案件是一对多,用户有很多音符,一个音符属于用户。 我的问题是与“NoteType”我不能返回“用户类型”,我可以返回创建的注意,但不是用户类型错误:Note.user字段类型必须是输出类型,但得到:[对象对象]

代码的用户的用户名(重要删除某些字段)

NoteType

当我取消去用户我有错误错误:Note.user字段类型必须是输出类型,但得到:[对象OBJE克拉。

import { 
    GraphQLObjectType, 
    GraphQLInt, 
    GraphQLString, 
    GraphQLBoolean, 
} from 'graphql'; 

import UserType from '../User/UserType'; 
import User from '../User/User'; 

const NoteType = new GraphQLObjectType({ 
    name: 'Note', 
    description: 'This represents a Note', 
    fields:() => ({ 
    id: { 
     type: GraphQLInt, 
     resolve: (note) => note.id, 
    }, 
    userId: { 
     type: GraphQLInt, 
     resolve: (note) => note.userId, 
    }, 
    title: { 
     type: GraphQLString, 
     resolve: (note) => note.note, 
    }, 
    username: { 
     type: GraphQLString, 
     resolve: (note) => (
     User 
      .findOne({ 
      where: { 
       id: note.userId, 
      }, 
      }).then(user => user.username) 
    ), 
    }, 
    /* user: { ***PROBLEM HERE!!*** 
     type: UserType, 
     resolve: (note) => (
     User 
      .findOne({ 
      where: { 
       id: note.userId, 
      }, 
      }).then(user => user) 
    ), 
    },*/ 
    }), 
}); 

module.exports = NoteType; 

的UserType

import { 
    GraphQLObjectType, 
    GraphQLInt, 
    GraphQLString, 
    GraphQLList, 
} from 'graphql'; 

import NoteType from '../Note/NoteType'; 
import Note from '../Note/Note'; 

import LocationType from '../Location/LocationType'; 
import Location from '../Location/Location'; 

const UserType = new GraphQLObjectType({ 
    name: 'User', 
    description: 'This represents a User', 
    fields:() => ({ 
    id: { 
     type: GraphQLInt, 
     resolve: (user) => user.id, 
    }, 
    username: { 
     type: GraphQLString, 
     resolve: (user) => user.username, 
    }, 
    email: { 
     type: GraphQLString, 
     resolve: (user) => user.email, 
    }, 
    notes: { 
     type: new GraphQLList(NoteType), 
     resolve: (user) => (
     Note 
      .findAll({ 
      where: { 
       userId: user.id, 
      }, 
      }) 
    ), 
    }, 
    }), 
}); 

module.exports = UserType; 

NoteQuery

import { 
    GraphQLInt, 
    GraphQLString, 
    GraphQLList, 
} from 'graphql'; 

import NoteType from '../../models/Note/NoteType'; 
import Note from '../../models/Note/Note'; 

import UserType from '../../models/User/UserType'; 
import User from '../../models/User/User'; 

const noteQuery = { 
    type: new GraphQLList(NoteType), 
    args: { 
    id: { 
     name: 'id', 
     type: GraphQLInt, 
    }, 
    userId: { 
     name: 'userId', 
     type: GraphQLInt, 
    }, 
    user: { 
     name: 'user', 
     type: GraphQLString, 
    }, 
    note: { 
     name: 'note', 
     type: GraphQLString, 
    }, 
    createdAt: { 
     name: 'createdAt', 
     type: GraphQLString, 
    }, 
    updatedAt: { 
     name: 'updatedAt', 
     type: GraphQLString, 
    }, 
    }, 
    resolve: (user, args) => Note.findAll({ where: args }), 
}; 

module.exports = noteQuery; 

UserQuery

import { 
    GraphQLInt, 
    GraphQLString, 
    GraphQLList, 
} from 'graphql'; 

import UserType from '../../models/User/UserType'; 
import User from '../../models/User/User'; 

const userQuery = { 
    users: { 
    type: new GraphQLList(UserType), 
    args: { 
     id: { 
     name: 'id', 
     type: GraphQLInt, 
     }, 
     username: { 
     name: 'username', 
     type: GraphQLString, 
     }, 
     email: { 
     name: 'email', 
     type: GraphQLString, 
     }, 
     createdAt: { 
     name: 'createdAt', 
     type: GraphQLString, 
     }, 
     updatedAt: { 
     name: 'updatedAt', 
     type: GraphQLString, 
     }, 
    }, 
    resolve: (user, args) => User.findAll({ where: args }), 
    }, 
    user: { 
    type: UserType, 
    args: { 
     id: { 
     name: 'id', 
     type: GraphQLInt, 
     }, 
     username: { 
     name: 'username', 
     type: GraphQLString, 
     }, 
     email: { 
     name: 'email', 
     type: GraphQLString, 
     }, 
     createdAt: { 
     name: 'createdAt', 
     type: GraphQLString, 
     }, 
     updatedAt: { 
     name: 'updatedAt', 
     type: GraphQLString, 
     }, 
    }, 
    resolve: (user, args) => User.findOne({ where: args }), 
    }, 
}; 

module.exports = userQuery; 

任何帮助或提示,提前致谢!

回答

1

看起来像循环依赖性问题。您将用户模块导入Note模块,同时将Note模块导入您的用户模块。 user字段的解析器正在查找GraphQLObjectType的实例,但它只接收导出类型的未完成副本。

您可以查看this question以获得更全面的解释和一些解决方法。

但是,我建议只需使用buildSchema并使用解析器通过根对象传递字符串文本来声明模式。或者使用graphql-toolmakeExecutableSchema,这更容易。无论哪种方式,您都可以节省处理循环依赖的头痛问题,并使您的模式更具可读性。

+0

谢谢,我会调查,谢谢你的提示! – Julieta

相关问题