2015-12-10 2 views
2

Я хочу разделить один nodeInterface с несколькими типами GraphQL. В настоящее время получаю эту ошибку:Share Relay nodeInterface

Error: User may only implement Interface types, it cannot implement: undefined. 

Я предрек интерфейс, как это:

// file: node-interface.js 
let {nodeInterface, nodeField} = nodeDefinitions(
    (globalId) => { 
    let {type, id} = fromGlobalId(globalId); 
    if (type === 'UserModel') {; 
     return UserModel.findOne(id).exec(); 
    } 
    return null; 
    }, 
    (obj) => { 
    if (obj instanceof UserModel) { 
     return UserType; 
    } 
    return null; 
    } 
); 

export { nodeInterface }; 
export { nodeField }; 

and attempting to use it in my UserType like this 

// file: user.js 
import { 
    nodeInterface 
} from ‘./node-interface'; 

let UserType = new GraphQLObjectType({ 
    name: 'User', 
    description: 'A user', 
    fields:() => ({ 
    id: globalIdField('User'), 
    username: { 
     type: GraphQLString, 
    }, 
    }), 
    interfaces: [nodeInterface] 
}); 

Что мне не хватает? Мне нужно разбить объявление нескольких типов GraphQL в соответствующие файлы и реализовать nodeInterface ...

+0

Не уверен, но, возможно, придется поставить типы в модуль реестра, чтобы разорвать nodeinterface <-> пользователя циклическую зависимость. –

ответ

6

Необходимо создать реестр типов для схемы любого вещества. Смотрите пример здесь:

Type Registry

, а затем создать nodeInterface и nodeField так:

// ./src/schema/node.js 
import { nodeDefinitions } from 'graphql-relay'; 

import { idFetcher, typeResolver } from './registry'; 

export const { nodeInterface, nodeField } = nodeDefinitions(
    idFetcher, typeResolver 
); 

проверку этого вопроса для получения дополнительной информации: Abstract type resolution

+4

Можно ли подробнее рассказать об этом для новичков? Благодарю. –

1

Thunk:

// interfaces: [nodeInterface] 
interfaces:() => [nodeInterface] 

details:

type GraphQLObjectTypeConfig = { 
    name: string; 
    interfaces?: GraphQLInterfacesThunk | Array<GraphQLInterfaceType>; 
    fields: GraphQLFieldConfigMapThunk | GraphQLFieldConfigMap; 
    isTypeOf?: (value: any, info?: GraphQLResolveInfo) => boolean; 
    description?: ?string 
} 

type GraphQLInterfacesThunk =() => Array<GraphQLInterfaceType>; 
+3

Вы можете и должны уточнить свой ответ, объяснить, что он делает, почему он работает, что-то вроде этого. –