2017-09-14 13 views
0

Ich versuche derzeit, Schemas für eine RootQuery zu erben, um mehr Modularität zu erhalten. Das Setup sieht derzeit wie folgt:GraphQL: Fehler: Schema-Abfrage muss Objekttyp sein aber bekam: [Objekt Objekt]

invoiceSchema.js

import { 
    GraphQLObjectType, 
    GraphQLInt, 
} from 'graphql'; 
export default new GraphQLObjectType({ 
    name: 'Invoice', 
    description: 'A monthly billing invoice for an organization', 
    fields:() => ({ 
     amountDue: { 
      type: GraphQLInt, 
      description: 'The amount the card will be charged (total + startingBalance with a min value of 0)' 
     }, 
    }) 
}); 

rootQuery.js

import { 
    GraphQLObjectType, 
    GraphQLString, 
    GraphQLInt, 
    GraphQLList, 
    GraphQLID 
} from 'graphql'; 
import Invoice from './invoiceSchema'; 

export default { 
    Invoice: { 
     type: Invoice, 
     resolve(parentValue, args){ 
      return 'Hello world'; 
     } 
    } 
}; 

schema.js

import query from './rootQuery'; 
import {GraphQLSchema} from 'graphql'; 

export default new GraphQLSchema({query}); 

Beim Versuch, die Folgendes zu tun Fehler und hoffte auf einige er lp und insight, denn was ich in invoiceSchema.js exportiere, ist eindeutig ein ObjectType und kein Objekt Objekt.

C:\project\node_modules\graphql\jsutils\invariant.js:19 
    throw new Error(message); 
    ^

Error: Schema query must be Object Type but got: [object Object]. 
    at invariant (C:\project\node_modules\graphql\jsutils\invariant.js:19:11) 
    at new GraphQLSchema (C:\project\node_modules\graphql\type\schema.js:72:88) 
    at Object.<anonymous> (C:/project/api/schema/schema.js:6:16) 
    at Module._compile (module.js:573:30) 
    at loader (C:\project\node_modules\babel-register\lib\node.js:144:5) 
    at Object.require.extensions.(anonymous function) [as .js] (C:\project\node_modules\babel-register\lib\node.js:154:7) 
    at Module.load (module.js:507:32) 
    at tryModuleLoad (module.js:470:12) 
    at Function.Module._load (module.js:462:3) 
    at Module.require (module.js:517:17) 
[nodemon] app crashed - waiting for file changes before starting... 

eigentlich die Idee von here bekam und ich frage mich, warum es nicht funktioniert ...

Antwort

0

Ihre Wurzel Abfrage muss eine Instanz von GraphQLObjectType jedoch sein, rootQuery.js ist ein einfaches Objekt exportieren stattdessen. Sie werden Ihren Export zu so etwas wie dies ändern müssen:

export default new GraphQLObjectType({ 
    name: 'RootQuery', 
    fields:() => ({ 
    invoice: { 
     type: Invoice, 
     resolve(parentValue, args){ 
      return 'Hello world'; 
     } 
    } 
    }) 
}; 

Hinweis: es üblich ist, alle Feldnamen zu halten, einschließlich der Abfrage und Mutation Namen, in Camelcase und verwendet Pascal für Typnamen, zu helfen, zu unterscheiden zwischen die Zwei.

Wenn Sie Ihr Schema modularisieren, kann es hilfreich sein, stattdessen graphql-tools für die Generierung Ihres Schemas zu verwenden. IMO, macht es Ihr Schema lesbarer und vermeidet einige der häufigsten Fallstricke, die Sie beim Modularisieren eines Schemas haben können. Die Dokumentation enthält ein gutes Beispiel dafür, wie Sie Ihr Schema mit makeExecutableSchemahere modularisieren können.

+0

Danke! Verwenden Sie es wie folgt nun: 'Exportstandard neue GraphQLObjectType ({ Name: 'RootQuery', Felder:() => ({ ... Rechnung }) };', die dann zum Fehler 'Fehler: RootQuery .name field config muss ein Objekt sein - was seltsam ist, da es auf die Zeichenfolge des Namens der Abfrage verweist. Vielleicht wissen Sie auch, wie Sie das beheben können. – schlumpfpirat

+0

Der Spread-Operator ist nicht geeignet. Sie setzen im Grunde die Felder auf Ihr "Invoice" -Typ, der nicht funktioniert. "fields" müssen entweder ein Objekt oder eine Funktion sein, die das Objekt zurückgibt. In jedem Fall ordnet dieses Objekt jedem Feldnamen ein anderes Objekt zu, das Details für dieses Feld enthält type ',' args', 'resolve', etc.) –

+0

Welcher Spread-Operator? – schlumpfpirat

Verwandte Themen