Как правильно писать резолверы GraphQL?

Итак, на сайте GraphQL есть документация по S # * t, насколько я могу судить по вложенным запросам, таким как пользовательские особенности, и это сводит меня с ума (я серьезно хочу вырвать себе волосы прямо сейчас). Может кто-нибудь объяснить мне, как работают револьверы и почему то, что я делаю, не работает?

ПРОБЛЕМА: я создал следующий файл index.js для своего GraphQL API:

var express = require('express');
var graphqlHTTP = require('express-graphql');
var { buildSchema } = require('graphql');

// Define Schemas
var schema = buildSchema(`
    type Query {
        user: User
    }
    type User {
        firstName: String
        lastName: String
        email: String
        socialMedia: SOCIALMEDIA
    }
    type SOCIALMEDIA {
        facebook: String
        instagram: String
        twitter: String
    }
`);

// Define resolver functions
var root = {
    User: {
        firstName: () => 'John',
        lastName: () => 'Doe',
        email: () => '[email protected]'
    },
    SOCIALMEDIA: {
        facebook: () => 'John Doe Facebook',
        instagram: () => 'John Doe Instagram',
        twitter: () => 'John Doe Twitter'
    }

 };

var app = express();
app.use('/', graphqlHTTP({
    schema: schema,
    rootValue: root,
    graphiql: true,
}));
app.listen(8080, () => console.log('Now browse to localhost:8080'));

И, несмотря на все мои усилия, когда я отправляю следующий запрос:

{
  user {
    firstName
  }
}

Получаю такой ответ:

{
  "data": {
    "user": null
  }
}

Почему _4 _?!?! Я даже не пытался увлечься user(id: $ID): [User] итерациями или чем-то похожим на передачу аргументов или функций, и это уже дает мне палку!

Что мне не хватает в работе вложенных полей?

РЕДАКТИРОВАТЬ: вау ... все работает?

user: () => ({
        firstName: 'John',
        lastName: 'Doe',
        email: '[email protected]',
        socialMedia: {
            facebook: 'John Doe Facebook',
            instagram: 'John Doe Instagram',
            twitter: 'John Doe Twitter'
        }
    }),

Какое жесткое правило для этой ерунды ??


person Graeme Ford    schedule 18.01.2019    source источник
comment
Передача резолверов через root - это, по сути, взлом и антишаблон. Если вы хотите использовать SDL для построения схемы, не используйте buildSchema; используйте makeExecutableSchema из graphql-tools. Дополнительные сведения см. В этом ответе.   -  person Daniel Rearden    schedule 18.01.2019


Ответы (1)


Попробуй это,

// Define Schemas
var schema = buildSchema(`
    type Query {
        getUser: User
        getSocialMedia: SOCIALMEDIA
    }
    type User {
        firstName: String
        lastName: String
        email: String
        socialMedia: SOCIALMEDIA
    }
    type SOCIALMEDIA {
        facebook: String
        instagram: String
        twitter: String
    }
`);

// Define resolver functions
var root = {
    getUser: {
        firstName: () => 'John',
        lastName: () => 'Doe',
        email: () => '[email protected]',
        socialMedia: {
          facebook: () => 'John Doe Facebook',
          instagram: () => 'John Doe Instagram',
          twitter: () => 'John Doe Twitter'
        }
    },
    getSocialMedia: {
        facebook: () => 'John Doe Facebook',
        instagram: () => 'John Doe Instagram',
        twitter: () => 'John Doe Twitter'
    }

 };
person Carlos Rufo    schedule 18.01.2019
comment
ВЫ СЭР ЛЕГЕНДА !!! Вы сохранили мою линию роста волос сегодня !!! Можете ли вы случайно объяснить, что я делал не так и почему это сработало? - person Graeme Ford; 18.01.2019
comment
Хорошо, таааак обновление. Таблица пользователей работает, а таблица социальных сетей - нет. Кажется, уловка в том, что я должен использовать user, а не User, чего я действительно не понимаю? Ни SOCIALMEDIA, ни socialMedia не работают с данными социальных сетей, поэтому я действительно не знаю, что происходит :( - person Graeme Ford; 18.01.2019
comment
В тривиальных примерах, резолверы ~ = поля запроса, я обновил пример, чтобы СУХОЙ через socialMedia, отметьте graphql.org/learn/execution/#trivial-resolvers - person Carlos Rufo; 18.01.2019