2016-08-24 8 views
6

Auf Serverstart (node index.js) Ich erhalte den folgenden Fehler mit meinem GraphQL NodeJS Server:GraphQL Args Fehler: Argument Typ muss Eingang Typ sein, aber bekam: function GraphQLObjectType (config) {

Error: Query.payment(data:) argument type must be Input Type but got: function GraphQLObjectType(config) { _classCallCheck(this, GraphQLObjectType);

Dieser Fehler passiert wenn ich änderte meine ursprüngliche args aus einem String

 args: { 
      data: { type: graphQL.GraphQLString } 
     }, 

einen Objekttyp:

 args: { 
      data: { type: graphQL.GraphQLObjectType } 
     }, 

Ich brauche einen Objekttyp, da ich mehrere Felder als Parameter senden muss.

GraphQL Server:

var Query = new graphQL.GraphQLObjectType({ 
    name: 'Query', 
    fields: { 
     payment: { 
      type: graphQL.GraphQLString, 
      args: { 
       data: { type: graphQL.GraphQLObjectType } 
      }, 
      resolve: function (_, args) { 
       // There will be more data here, 
       // but ultimately I want to return a string 
       return 'success!'; 
      } 
     } 
    } 
}); 

Wie kann ich erlaube es, ein Objekt zu akzeptieren?


Frontend (bei Bedarf aber der Fehler passiert ist, bevor ich dies auch senden.):

var userQuery = encodeURIComponent('{ payment (data: { user : "test" })}'); 

$.get('http://localhost:4000/graphql?query=' + userQuery, function (res) { 
     //stuff 
}); 

Antwort

12

Wenn Sie Objekt als Argument verwenden möchten, sollten Sie GraphQLInputObjectType statt GraphQLObjectType verwenden. Denken Sie daran, dass GraphQL stark typbasiert ist. Daher dürfen Sie keinen generischen GraphQLObjectType als arg-Typ verwenden und dann Args dynamisch abfragen. Sie müssen explizit alle möglichen Felder in diesem Eingabeobjekt definieren (und entscheiden, welche von ihnen vorgeschrieben sein würde und welche nicht)

Try Verwendung dieser Ansatz:

// your arg input object 
var inputType = new GraphQLInputObjectType({ 
    name: 'paymentInput', 
    fields: { 
     user: { 
      type: new GraphQLNonNull(GraphQLString) 
     }, 
     order: { 
      type: GraphQLString 
     }, 
     ...another fields 
    } 
}); 

var Query = new graphQL.GraphQLObjectType({ 
    name: 'Query', 
    fields: { 
     payment: { 
      type: graphQL.GraphQLString, 
      args: { 
       data: { type: new GraphQLNonNull(inputType) } 
      }, 
      resolve: function (_, args) { 
       // There will be more data here, 
       // but ultimately I want to return a string 
       return 'success!'; 
      } 
     } 
    } 
}); 
+0

Dank Herr Dave. Ich änderte es schließlich in eine "Mutation" und spezifizierte Felder. Übrigens, noch zwei Fragen: '1)' Gibt es einen besseren Weg, um meine POST-Abfrage zu schreiben als 'encodeURIComponent ('{payment (data: {user:" test "})});'? Dies wird unhandlich, jedes Feld manuell anzugeben, wenn das Objekt groß ist. '2)' GraphQL scheint eine 'Abfrage' zu ​​erfordern, obwohl ich nur eine' Mutation' benötige. Muss ich immer eine Frage haben oder gibt es irgendwo eine Option? – Growler

+0

'1)' Ich nehme an, dass Sie eine jquery ajax verwenden, um eine graphql Aufrufe entsprechend Ihrem gegebenen Beispiel zu machen. Leider kann ich dir damit nicht helfen, da ich in meinem Projekt ein 'Relay' am' ReactJS' Frontend verwende, welches dafür verantwortlich ist. '2)' Offenbar ist 'Abfrage' immer im Schema erforderlich. Schau dir die 'graphql-js' Quelle [code] an (https://github.com/graphql/graphql-js/blob/master/src/type/schema.js#L58) Ich hoffe ich habe half dir mit wenigstens etwas – LordDave

Verwandte Themen