2016-11-02 3 views
1

Я пытаюсь реализовать очень простой интерфейс GraphQL в Node.js, но независимо от того, что я делаю, я не могу получить метод resolve моего типа foo для запуска. Когда я запускаю следующий код в модульном тесте, он выполняется успешно, но я вижу из (отсутствия) вывода консоли, что resolve не был вызван, и в результате я получаю пустой объект обратно, когда я вызываю graphql(FooSchema, query).Почему GraphQL (на Node.js) не вызывает мой метод «решения»?

Может ли кто-нибудь более опытный с GraphQL предположить, что я могу делать неправильно? Я совершенно сбит с толку относительно того, как вся операция может даже завершиться успешно, если GraphQL не может найти и вызвать метод, который должен возвращать результаты ...

const fooType = new GraphQLInterfaceType({ 
    name: `Foo`, 
    description: `A foo`, 
    fields:() => ({ 
     id: { 
      description: `The foo's id`, 
      type: new GraphQLNonNull(GraphQLInt), 
     }, 
     title: { 
      description: `The foo's title`, 
      type: new GraphQLNonNull(GraphQLString), 
     } 
    }) 
}); 
const queryType = new GraphQLObjectType({ 
    fields: { 
     foo: { 
      args: { 
       id: { 
        description: 'ID of the foo', 
        type: new GraphQLNonNull(GraphQLString) 
       } 
      }, 
      resolve: (root, { id }) => { 
       console.log(12345); 
       return getFoo(id) 
      }, 
      type: fooType, 
     } 
    }, 
    name: 'Query', 
}); 

export default new GraphQLSchema({ 
    query: queryType, 
    types: [fooType], 
}); 

// In test: 
const query = ` 
    foo { 
     title 
    } 
`; 
const result = graphql(FooSchema, query); // == {} 

ответ

1
const fooType = new GraphQLInterfaceType({ 
    name: `Foo`, 
    description: `A foo`, 
    fields:() => ({ 
     id: { 
      description: `The foo's id`, 
      type: new GraphQLNonNull(GraphQLInt), 
     }, 
     title: { 
      description: `The foo's title`, 
      type: new GraphQLNonNull(GraphQLString), 
     } 
    }) 
}); 

Это тип интерфейса , однако ваш потребитель queryType никогда инвентарь it. Быстрое решение должно быть, чтобы изменить его к этому:

const fooType = new GraphQLObjectType({ 
    name: `Foo`, 
    description: `A foo`, 
    fields:() => ({ 
     id: { 
      description: `The foo's id`, 
      type: new GraphQLNonNull(GraphQLInt), 
     }, 
     title: { 
      description: `The foo's title`, 
      type: new GraphQLNonNull(GraphQLString), 
     } 
    }) 
}); 

Вот пример, который работает для меня:

const { 
    GraphQLNonNull, 
    GraphQLInt, 
    GraphQLString, 
    GraphQLObjectType, 
    GraphQLSchema, 
    graphql, 
} = require('graphql'); 

const fooType = new GraphQLObjectType({ 
    name: `Foo`, 
    description: `A foo`, 
    fields:() => ({ 
    id: { 
     description: `The foo's id`, 
     type: new GraphQLNonNull(GraphQLInt), 
    }, 
    title: { 
     description: `The foo's title`, 
     type: new GraphQLNonNull(GraphQLString), 
    }, 
    }), 
}); 

const queryType = new GraphQLObjectType({ 
    fields: { 
    foo: { 
     args: { 
     id: { 
      description: 'ID of the foo', 
      type: new GraphQLNonNull(GraphQLString), 
     }, 
     }, 
     resolve: (root, { id }) => { 
     return { id, title: 'some-title' }; 
     }, 
     type: fooType, 
    }, 
    }, 
    name: 'Query', 
}); 

const schema = new GraphQLSchema({ 
    query: queryType, 
    types: [fooType], 
}); 

graphql(schema, `{ foo (id:"123") { id, title } }`).then(console.log.bind(console)); 

Это должно напечатать:

$ node test.js 
{ data: { foo: { id: 123, title: 'some-title' } } } 

Вот документацию на InterfaceType : http://graphql.org/learn/schema/#interfaces

+0

Благодарим за предложение: Я копировал/вставлял из примера Star Wars И я не должен был уделять достаточное внимание тем, что я копирую. Однако изменение 'fooType' в качестве нового' GraphQLObjectType' не решает мою проблему: мой 'resolve' до сих пор не вызван, а вызов' graphql' по-прежнему возвращает пустой объект :( – machineghost

+0

Что возвращает 'getFoo (id) 'делать точно? –

+0

Ничего (или, быть более точным, это не имеет значения), потому что он даже не вызван. Это корневая проблема: если бы я мог просто получить' graphql', чтобы вызвать его (через 'resolve') . d установить – machineghost

Смежные вопросы