Edge.node 字段类型必须是输出类型但得到:未定义

Posted

技术标签:

【中文标题】Edge.node 字段类型必须是输出类型但得到:未定义【英文标题】:Edge.node field type must be Output Type but got: undefined 【发布时间】:2016-06-29 20:27:59 【问题描述】:

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

在尝试验证或加载架构时出现以下错误:

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

这是由于在其他类型定义之一中具有事件类型的连接类型。

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

我提供了一个导致相同问题的简化架构示例:

  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】:

在分配给 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,
);

【讨论】:

以上是关于Edge.node 字段类型必须是输出类型但得到:未定义的主要内容,如果未能解决你的问题,请参考以下文章

Graphql 日期字段类型必须是输出类型但得到:未定义

带有快速错误的 GraphQL:Query.example 字段类型必须是输出类型,但得到:[object Object]

带有 Keystone 的 GraphQL 需要字段类型必须是输出类型,但得到:未定义

错误:Note.user 字段类型必须是输出类型,但得到:[object Object]

节点 - GraphQL - Ad.user 字段类型必须是输出类型,但得到:未定义

Meal.nutrition 的类型必须是输出类型,但得到:未定义 [重复]