Структура мутации GraphQL

Я пытаюсь создать сервер Graphql Node.js в Typescript. Я использую Express и express-graphql. У меня есть некоторые проблемы с тем, как структурировать свою мутацию, когда я хочу создать нового пользователя.

Моя цель - иметь возможность использовать такую ​​мутацию:

mutation {
  user {
    create(
      data: {
        name: "Foo Bar"        
      }
    ) {
      id,
      name
    }    
  }
}

Вот мои типы пользователей:

import {
  GraphQLObjectType,
  GraphQLNonNull,
  GraphQLBoolean,
  GraphQLString,
  GraphQLInputObjectType
} from 'graphql';

export const UserType = new GraphQLObjectType({
  name: 'User',
  description: 'A user of the application',
  fields: () => ({
    id: {
      type: new GraphQLNonNull(GraphQLString),
      description: 'The id of the user',
    },
    name: {
      type: new GraphQLNonNull(GraphQLString),
      description: 'The name of the user',
    }
  })
});

export const UserInputType = new GraphQLInputObjectType({
  name: 'UserInputType',
  description: 'User payload definition',
  fields: () => ({
    name: { type: new GraphQLNonNull(GraphQLString) }
  })
});

Вот моя попытка определить мутацию на сервере:

// ../user/user-mutations.ts

export const userMutations = {
  user: {
    type: new GraphQLObjectType({
      name: 'CreateUser',
      fields: {
        create: {
          type: UserType,
          args: {
            data: {
              type: new GraphQLNonNull(UserInputType),
            }
          },
          resolve: async (rootValue, { data }) => {
            return Object.assign(data, {
              id: '123'
            });
          }
        }
      }
    })
  }
};

Мои ошибки / вывод:

{
  "errors": [
    {
      "message": "Cannot convert undefined or null to object",
      "locations": [
        {
          "line": 36,
          "column": 3
        }
      ],
      "path": [
        "user"
      ]
    }
  ],
  "data": {
    "user": null
  }
}

Вопрос 1. Не является ли такой способ структурирования мутации оптимальным? Должен ли я лучше сделать что-то вроде:

mutation {
  createUser(
    name: "Foo Bar"
  ) {
    id,
    name
  }
}

Вопрос 2: Если моя первая структура в порядке, как я могу исправить структуру моей мутации на сервере, чтобы создать моего пользователя и вернуть запрошенные значения?

Редактировать: Вот моя схема верхнего уровня:

import { userQueries } from '../user/user-queries';

export const queries = {
  ...userQueries
};

import { userMutations } from '../user/user-mutations';

export const mutations = {
  ...userMutations
};


const rootQuery = new GraphQLObjectType({
  name: 'RootQuery',
  fields: queries
});

const rootMutation = new GraphQLObjectType({
  name: 'RootMutation',
  fields: mutations
});

export const schema = new GraphQLSchema({
  query: rootQuery,
  mutation: rootMutation
});

Измените свой вопрос, включив в него схему для вашего объекта мутации верхнего уровня.

Daniel Rearden 04.05.2018 21:09

Я добавил схему верхнего уровня, надеюсь, это поможет!

Øyvind 07.05.2018 06:49

Я могу эффективно скопировать и вставить ваш код в пустой проект, и он отлично работает с одной небольшой модификацией - вам нужно добавить функцию разрешения для типа CreateUser, которая возвращает пустой объект. Без него распознаватель create никогда не запускается, и пользователь просто возвращает ноль. Я действительно не могу придумать, как воспроизвести ошибку, которую вы видите.

Daniel Rearden 07.05.2018 07:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
1
3
255
0

Другие вопросы по теме