2016-03-14 14 views
5

Relay互換のGraphQLスキーマを使用してnode.jsサーバーを設定しようとしています。Edge.nodeフィールドタイプは出力タイプである必要がありますが、未定義です

スキーマを検証したりロードしようとしたとき、私は次のエラーを取得する:

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

これは、他のタイプの定義の1つでイベントタイプ用の接続タイプを持つことによって引き起こされます。

非常に冗長なのでスキーマ全体を投稿しませんが、接続フィールドがコメントアウトされると、スキーマが正しくロードされ、エラーはスローされません。あなたはそれに割り当てる前EventTypeへの参照を行った

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 

答えて

7

私は同じ問題が発生し、簡略化スキーマの例を含めました。最初にタイプを定義し、接続でそれを使用します:

/** 
* 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, 
}); 
関連する問題