Edge.node字段types必须是输出types,但是:undefined

我正在尝试使用与Relay兼容的GraphQL架构来设置node.js服务器。

当试图validation或加载架构时,我得到以下错误:

EventEdge.node field type must be Output Type but got: undefined.

这是由其他types定义中的Eventtypes的连接types引起的。

我不会发布整个模式,因为它非常详细,但是当连接字段被注释掉时,模式被正确加载,并且不会引发错误。

我已经包含了一个导致相同问题的简化模式的例子:

  const graphql = require('graphql') const relay = require('graphql-relay') const GraphQLID = graphql.GraphQLID, GraphQLInt = graphql.GraphQLInt, GraphQLString = graphql.GraphQLString, GraphQLList = graphql.GraphQLList, GraphQLObjectType = graphql.GraphQLObjectType, GraphQLSchema = graphql.GraphQLSchema, GraphQLNonNull = graphql.GraphQLNonNull const connectionArgs = relay.connectionArgs, connectionDefinitions = relay.connectionDefinitions, connectionFromArray = relay.connectionFromArray, cursorForObjectInConnection = relay.cursorForObjectInConnection, fromGlobalId = relay.fromGlobalId, globalIdField = relay.globalIdField, mutationWithClientMutationId = relay.mutationWithClientMutationId, nodeDefinitions = relay.nodeDefinitions, toGlobalId = relay.toGlobalId // Models (ORM Mappings) const models = require('../models') // Model handlers const handlers = require('../models/handlers') /* * Relay Node Definition: * {nodeInterface, nodeField} = nodeDefinitions */ var nodeDefinition = nodeDefinitions( (globalId) => { // {type, id} = fromGlobalId(globalId) const gid = fromGlobalId(globalId); switch (gid.type) { case 'User': return handlers.getUser(id) // case 'Event': // return handlers.getEvent(id) // // case 'Club': // return handlers.getClub(id) default: return null } }, (obj) => { switch (true) { case (obj instanceof models.User): return UserType // case (obj instanceof models.Club): // return ClubType // // case (obj instanceof models.Event): // return EventType default: return null } } ) /************************** ************************** * Relay Connections * * { connectionType, edgeType } = connectionDefinitions({nodeType: LoremType}) ************************** **************************/ // User Connection // const usersConnection = connectionDefinitions({name: 'User', nodeType: UserType}) // Event Connection const eventsConnection = connectionDefinitions({name: 'Event', nodeType: EventType}) // Club Connection // const clubsConnection = connectionDefinitions({name: 'Club', nodeType: ClubType}) /************************** ************************** * GraphQL Type Definitions ************************** **************************/ /* * User Type * * type User : Object { * id: String! * first_name: String * last_name: String * friends: [User] * } */ var UserType = new GraphQLObjectType({ name: 'User', description: 'A user of the app.', fields: () => ({ id: globalIdField('User'), events: { type: eventsConnection.connectionType, description: 'User\'s events.', args: connectionArgs, resolve: (user, args) => connectionFromArray(getEvents(), args) } }), interfaces: [nodeDefinition.nodeInterface] }) /* ** Event Type * * type Event : Object { * id: String! * title: String * description: String * datetime: Int * location: [Int] * managers: [User] * club: Club * members: [User] * } */ var EventType = new GraphQLObjectType({ name: 'Event', description: 'An event in the app.', fields: () => ({ id: globalIdField('Event'), name: { type: GraphQLString, description: 'Event\'s name.', resolve: event => event.get('name') } }), interfaces: [nodeDefinition.nodeInterface] }) /**************************** **************************** * Relay Mutation Definitions **************************** ****************************/ /************************** ************************** * Root Schema Definitions ************************** **************************/ /* ** Root Query * * type Query { * user(id: String!): User * club(id: String!): Club * event(id: String!): Event * } */ var QueryType = new GraphQLObjectType({ name: 'Query', fields: () => ({ node: nodeDefinition.nodeField, user: { type: UserType, resolve: () => handlers.getUser() } }) }) /* ** Root Schema * * type Schema { * query: Query * mutation: Mutation * } */ var Schema = new GraphQLSchema({ query: QueryType }) module.exports = Schema 

在分配给它之前,您已经对EventType进行了引用。 首先定义types,然后在连接中使用它:

 /** * Event Type * * type Event : Object { * id: String! * title: String * description: String * datetime: Int * location: [Int] * managers: [User] * club: Club * members: [User] * } */ var EventType = new GraphQLObjectType({ name: 'Event', description: 'An event in the app.', fields: () => ({ id: globalIdField('Event'), name: { type: GraphQLString, description: 'Event\'s name.', resolve: event => event.get('name') }, }), interfaces: [nodeDefinition.nodeInterface], }); // Event Connection const eventsConnection = connectionDefinitions({ name: 'Event', nodeType: EventType, });