Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Graphql mutation error: "Field 'createUser' is missing required arguments: input"

I'm trying to follow along this article on how to create a mutation on a rails server using GraphQl https://www.howtographql.com/graphql-ruby/4-authentication

However, I'm stuck at the CreateUser Mutation step, I get the follow error hash when trying it out in GraphiQL:

{
  "errors": [
    {
      "message": "Field 'createUser' is missing required arguments: input",
      "locations": [
        {
          "line": 45,
          "column": 3
        }
      ],
      "path": [
        "mutation CreateUser",
        "createUser"
      ],
      "extensions": {
        "code": "missingRequiredArguments",
        "className": "Field",
        "name": "createUser",
        "arguments": "input"
      }
    },
    {
      "message": "Field 'createUser' doesn't accept argument 'username'",
      "locations": [
        {
          "line": 46,
          "column": 5
        }
      ],
      "path": [
        "mutation CreateUser",
        "createUser",
        "username"
      ],
      "extensions": {
        "code": "argumentNotAccepted",
        "name": "createUser",
        "typeName": "Field",
        "argumentName": "username"
      }
    },
    {
      "message": "Field 'createUser' doesn't accept argument 'authProvider'",
      "locations": [
        {
          "line": 47,
          "column": 5
        }
      ],
      "path": [
        "mutation CreateUser",
        "createUser",
        "authProvider"
      ],
      "extensions": {
        "code": "argumentNotAccepted",
        "name": "createUser",
        "typeName": "Field",
        "argumentName": "authProvider"
      }
    },
    {
      "message": "Variable $username is declared by CreateUser but not used",
      "locations": [
        {
          "line": 44,
          "column": 1
        }
      ],
      "path": [
        "mutation CreateUser"
      ],
      "extensions": {
        "code": "variableNotUsed",
        "variableName": "username"
      }
    },
    {
      "message": "Variable $email is declared by CreateUser but not used",
      "locations": [
        {
          "line": 44,
          "column": 1
        }
      ],
      "path": [
        "mutation CreateUser"
      ],
      "extensions": {
        "code": "variableNotUsed",
        "variableName": "email"
      }
    },
    {
      "message": "Variable $password is declared by CreateUser but not used",
      "locations": [
        {
          "line": 44,
          "column": 1
        }
      ],
      "path": [
        "mutation CreateUser"
      ],
      "extensions": {
        "code": "variableNotUsed",
        "variableName": "password"
      }
    }
  ]
}

I just followed the code in the article, my files:

create_user.rb

module Mutations
  class CreateUser < BaseMutation
    # often we will need input types for specific mutation
    # in those cases we can define those input types in the mutation class itself
    class AuthProviderSignupData < Types::BaseInputObject
      argument :credentials, Types::AuthProviderCredentialsInput, required: false
    end

    argument :username, String, required: true
    argument :auth_provider, AuthProviderSignupData, required: false

    type Types::UserType

    def resolve(username: nil, auth_provider: nil)
      User.create!(
        username: username,
        email: auth_provider&.[](:credentials)&.[](:email),
        password: auth_provider&.[](:credentials)&.[](:password)
      )
    end
  end
end

user_type.rb

module Types
  class UserType < BaseObject
    field :id, ID, null: false
    field :email, String, null: false
    field :username, String, null: false
    field :photo, String, null: true
    field :phone, String, null: false
    field :island, IslandType, null: false, method: :island
    field :archipel, ArchipelType, null: false, method: :archipel

    field :created_at, String, null: false
    field :updated_at, String, null: false
  end
end

I have no clue where this 'input' thing is coming from.

like image 327
Hugo Avatar asked Feb 28 '20 19:02

Hugo


2 Answers

Without realizing I inilialized my project with a configuration that used Relay.

By commenting this code inside my **_schema.rb file it worked again.

  # Opt in to the new runtime (default in future graphql-ruby versions)
  # use GraphQL::Execution::Interpreter
  # use GraphQL::Analysis::AST

  # Add built-in connections for pagination
  # use GraphQL::Pagination::Connections

As well as these lines inside base_mutation.rb and replaces with these.

  # class BaseMutation < GraphQL::Schema::RelayClassicMutation
  #   argument_class Types::BaseArgument
  #   field_class Types::BaseField
  #   input_object_class Types::BaseInputObject
  #   object_class Types::BaseObject
  # end

  class BaseMutation < GraphQL::Schema::Mutation
    null false
  end
like image 76
Hugo Avatar answered Nov 19 '22 08:11

Hugo


If you're not interested in commenting out fields... I ran across the same error. For whatever reason input is the name of the key you pass your arguments into as a hash/object.

Example from using this tutorial:https://www.howtographql.com/graphql-ruby/3-mutations/

mutation {
  createLink(input: {
    url: "foo",
    description:"bar"
  }) {
    url
    description
  }
}
like image 39
Stephen Avatar answered Nov 19 '22 09:11

Stephen