'GraphQL how to mutate data

I have a basic schema for mutating some data which looks like

const schema = new graphql.GraphQLSchema({
    mutation: new graphql.GraphQLObjectType({
        name: 'Remove',
        fields: {
            removeUser: {
                type: userType,
                args: {
                    id: { type: graphql.GraphQLString }
                },
                resolve(_, args) {
                    const removedData = data[args.id];
                    delete data[args.id];
                    return removedData;
                },
            },
        },
    })
});

Looking around google I cant find a clear example of the example query which needs to be sent to mutate.

I have tried

POST - localhost:3000/graphql?query={removeUser(id:"1"){id, name}}

This fails with error:

{
  "errors": [
    {
      "message": "Cannot query field \"removeUser\" on type \"Query\".",
      "locations": [
        {
          "line": 1,
          "column": 2
        }
      ]
    }
  ]
}


Solution 1:[1]

In order to post requests from the front-end application it is recommended to use apollo-client package. Say i wanted to validate a user login information:

import gql from 'graphql-tag';
import ApolloClient, {createNetworkInterface} from 'apollo-client';

client = new ApolloClient({
    networkInterface: createNetworkInterface('http://localhost:3000/graphql')
});

remove(){
    client.mutate({
            mutation: gql`
                mutation remove(
                  $id: String!
                ) {
                  removeUser(
                    id: $id
                  ){
                    id,
                    name
                  }
                }
              `,
            variables: {
                id: "1"
            }
        }).then((graphQLResult)=> {
            const { errors, data } = graphQLResult;

            if(!errors && data){
                console.log('removed successfully ' + data.id + ' ' + data.name);
            }else{
                console.log('failed to remove');
            }
    })
}

More information about apollo-client can be found here

Have you tried using graphiql to query and mutate your schema?

If you'd like to create a POST request manually you might wanna try to struct it in the right form:

?query=mutation{removeUser(id:"1"){id, name}}

(Haven't tried POSTing myself, let me know if you succeeded, i structured this out of the url when using graphiql)

Solution 2:[2]

You have to explicitly label your mutation as such, i.e.

mutation {
  removeUser(id: "1"){
    id,
    name
  }
}

In GraphQL, if you leave out the mutation keyword, it's just a shorthand for sending a query, i.e. the execution engine will interpret it as

query {
  removeUser(id: "1"){
    id,
    name
  }
}

cf. Section 2.3 of the GraphQL Specification

Solution 3:[3]

const client = require("../common/gqlClient")();
const {
  createContestParticipants,
} = require("../common/queriesAndMutations");
const gql = require("graphql-tag");
const createPartpantGql = async (predictObj) => {
        try {
        let resp = await client.mutate({
          mutation: gql(createContestParticipants),
          variables: {
            input: {
              ...predictObj,
            },
          },
        });
      let contestParticipantResp = resp.data.createContestParticipants;
              return {
      success: true,
      data: contestParticipantResp,
    };
  } catch (err) {
      console.log(err.message)
    console.error(`Error creating the contest`);
    return {
      success: false,
      message: JSON.stringify(err.message),
    };
  }
  
};

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Kesem David
Solution 2 helfer
Solution 3 vantaku ramesh