Как выполнить мутацию в GraphQL? - PullRequest
0 голосов
/ 17 сентября 2018

В GraphQL у нас в основном два типа операций: запросы и мутации. В то время как запросы хорошо описаны в документации и есть много примеров, мне трудно понять, как выполнить мутацию. Мутации, очевидно, являются методами обновления.

Я создал очень простой сервер Node.js:

var express = require("express");
var graphqlHTTP = require("express-graphql");
var graphql = require("graphql");
var inMemoryDatabase = require("./inMemoryDatabase").inMemoryDatabase;
var _ = require("lodash-node");

var userType = new graphql.GraphQLObjectType({
  name: "User",
  fields: {
    id: { type: graphql.GraphQLString },
    name: { type: graphql.GraphQLString }
  }
});

var queryType = new graphql.GraphQLObjectType({
  name: "Query",
  fields: {
    user: {
      type: userType,
      args: {
        id: { type: graphql.GraphQLString }
      },
      resolve: function(parent, { id }) {
        return _.find(inMemoryDatabase, { id: id });
      }
    }
  }
});

var mutationType = new graphql.GraphQLObjectType({
  name: "Mutation",
  fields: {
    user: {
      type: userType,
      args: {
        id: { type: graphql.GraphQLString },
        name: { type: graphql.GraphQLString }
      },
      resolve: function(parent, { id, name }) {
        var index = _.findIndex(inMemoryDatabase, { id: id });
        inMemoryDatabase.splice(index, 1, { id: id, name: name });
        return _.find(inMemoryDatabase, { id: id });
      }
    }
  }
});

var schema = new graphql.GraphQLSchema({
  query: queryType,
  mutation: mutationType
});

var app = express();
app.use(
  "/graphql",
  graphqlHTTP({
    schema: schema,
    graphiql: true
  })
);

var port = 9000;
if (process.env.PORT) {
  port = process.env.PORT;
}

app.listen(port);
console.log("Running a GraphQL API server at localhost:" + port + "/graphql");

В базе данных находится просто массив пользовательских объектов {id, name}:

var inMemoryDatabase = [
  {
    id: "31ce0260-2c23-4be5-ab78-4a5d1603cbc8",
    name: "Mark"
  },
  {
    id: "2fb6fd09-2697-43e2-9404-68c2f1ffbf1b",
    name: "Bill"
  }
];

module.exports = {
  inMemoryDatabase
};

Выполнение запроса для получения пользователя по идентификатору выглядит следующим образом:

{
 user(id: "31ce0260-2c23-4be5-ab78-4a5d1603cbc8"){
  name
 }
}

Как будет выглядеть имя пользователя, изменяющее мутацию?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

@ Ответ Аустио был довольно близок, но правильный путь:

mutation updateUser {
  user(id: "31ce0260-2c23-4be5-ab78-4a5d1603cbc8", name: "Markus") {
    id
    name
  }
}
0 голосов
/ 18 сентября 2018

Эй, может, совершенно не хватает того, что вы говорите, но то, как я смотрю на мутацию, выглядит следующим образом:

  • Я получаю некоторые аргументы и поле, то же самое, что params ипуть в состоянии покоя, с теми, что я делаю (в вашем случае ищите пользователя и обновляйте атрибут на основе аргументов, переданных в
  • . После этого я возвращаю что-то из функции разрешения, которая будет соответствовать указанному вами типу)в type мутации

var mutationType = new graphql.GraphQLObjectType({
  name: "Mutation",
  fields: {
    user: {
      // You must return something from your resolve function 
      // that will fulfill userType requirements
      type: userType,
      
      // with these arguments, find the user and update them
      args: {
        id: { type: graphql.GraphQLString },
        name: { type: graphql.GraphQLString }
      },
      // this does the lookup and change of the data
      // the last step of your result is to return something
      // that will fulfill the userType interface
      resolve: function(parent, { id, name }) {
        // Find the user, Update it
        // return something that will respond to id and name, probably a user object
      }
    }
  }
});

Затем с этим в качестве контекста вы передаете некоторые аргументы и запрашиваете обратно пользователя

mutation updateUser {
  user(id: "1", name: "NewName") {
    id
    name
  }
}

В обычной производственной схеме вы также обычно имели бычто-то вроде errors, которое может быть возвращено для передачи различных состояний обновления для сбойного / не найденного

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...