Что я делаю не так с этим запросом GraphQL?

Я новичок в GraphQL, и я пытаюсь произвести мутацию, чтобы удалить статью из моей базы данных, но не могу понять, как это сделать. Я использую Node.js, Mongoose и GraphQL.

Это мутация моей схемы.

const Mutation = new GraphQLObjectType({
  name: 'Mutation',
  description: 'Articles Mutations',
  fields: () => ({
    remove: {
      type: articleType,
      description: 'Deletes an article by id',
      args: {
        id: {
          type: new GraphQLNonNull(GraphQLString)
        }
      },
      resolve: (value, {id}) => {
        return db.Article.findOneAndRemove({_id: new ObjectId(id)});
      }
    }
  })
});

И это запрос, который я использую при вызове API для удаления статьи.

export const DELETE_ARTICLE_QUERY = (id) => (`{
  remove(id: "${id}") {
    id
    author
    content
    published
    tags
    title
    excerpt
  }
}`);

Что я делаю неправильно?

Я получаю сообщение об ошибке 400 Bad Request. Сообщение: «Невозможно удалить поле запроса» для типа «Мутация».


person Jesus Mendoza    schedule 21.07.2017    source источник
comment
Задавая подобный вопрос, полезно предоставить как можно больше подробностей. Например: выдает ли GraphQL или узел какие-либо ошибки при выполнении запроса и что они говорят.   -  person Daniel Rearden    schedule 21.07.2017


Ответы (1)


При выполнении запроса GraphQL лучше всегда указывать тип выполняемой операции (запрос или изменение). Когда вы этого не сделаете, GraphQL предполагает, что вы делаете запрос, что здесь не так. Вы не указали, наблюдали ли вы какие-либо ошибки, но я готов поспорить, что GraphQL возвращает что-то вроде cannot query field remove on Query.

Измените DELETE_ARTICLE_QUERY, чтобы включить операцию:

export const DELETE_ARTICLE_QUERY = (id) => (`mutation {

Рекомендуется включать имя операции в целях отладки, чтобы вы также могли сказать:

export const DELETE_ARTICLE_QUERY = (id) => (`mutation DeleteArticle {

Изменить. Судя по указанной вами ошибке, объект схемы настроен неправильно. Это должно выглядеть примерно так:

const schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: "WhateverNameYouWantForQuery",
    fields: {
      // each query is a property here
    }
  }),
  mutation: new GraphQLObjectType({
    name: "WhateverNameYouWantForMutation",
    fields: {
      // each mutation is a property here
    }
  }),
});

Если вы определяете свои мутации как отдельную переменную (Mutation), вы можете помочь значению свойства мутации как этой переменной:

const schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    // query props
  }),
  mutation: Mutation
  }),
});

Вот рабочий пример, который вы можете выбросить из коробки и поэкспериментировать. После запуска сервера вы можете перейти к http://localhost:3000/graphql в своем браузере, чтобы получить доступ к интерфейсу GraphiQL и поиграть с потенциальными запросами / изменениями в нем.

const graphqlHTTP = require('express-graphql');
const app = require('express')();
const {
  GraphQLSchema,
  GraphQLObjectType,
  GraphQLNonNull,
  GraphQLString,
  GraphQLList
} = require('graphql');

const articleType = new GraphQLObjectType({
  name: 'Article',
  fields: {
    title: {
      type: GraphQLString,
    },
  },
});

const Mutation = new GraphQLObjectType({
  name: "RootMutationnnnn",
  fields: () => ({
    remove: {
      type: articleType,
      args: {
        id: {
          type: new GraphQLNonNull(GraphQLString)
        }
      },
      resolve: (value, {id}) => {
        return {title: 'Testing a delete'};
      }
    }
  })
});

const schema = new GraphQLSchema({
  query: new GraphQLObjectType({
    name: "RootQueryyyyy",
    fields: {
      articles: {
        type: new GraphQLList(articleType),
        resolve: () => {
          return [{title: 'Test title'}, {title: 'Test title'}];
        }
      }
    }
  }),
  mutation: Mutation
});

const root = {};

app.post('/graphql', graphqlHTTP({
  schema,
  rootValue: root,
  graphiql: false,
}));

app.get('/graphql', graphqlHTTP({
  schema,
  rootValue: root,
  graphiql: true,
}));

app.listen(3000, function(){
  console.log('listening on port 3000');
});
person Daniel Rearden    schedule 21.07.2017
comment
Спасибо за ваш комментарий и действительно полезные топы. Однако я все еще получаю ошибку 400 Bad Request :( - person Jesus Mendoza; 21.07.2017