Edge.node字段类型必须是输出类型,但得到:undefined

时间:2016-03-14 17:00:40

标签: node.js graphql relayjs graphql-js

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

尝试验证或加载架构时,我收到以下错误:

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

这是由于在其他类型定义之一中为Event类型建立了连接类型。

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

我已经包含了导致相同问题的简化架构示例:

  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

1 个答案:

答案 0 :(得分:7)

在分配给EventType之前,您已经引用了/** * 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, }); 。首先定义类型,然后在连接中使用它:

<div id="carousel">
    <div class="slide">
        <img>
        <h3>caption</h3>
    </div>
</div>