2017-11-02 3 views
0

Ich versuche, eine REST-API in GraphQL zu wickeln, und ich stieß auf diese. Stellen Sie sich vor Ich habe folgende Art:GraphQL: Wiederverwendung von Argumenten von root_query in einem Typ

const CbookType = new GraphQLObjectType({ 
name: 'CbookType', 
fields:() => ({ 
    id: { type: GraphQLID }, 
    title: { type: GraphQLString }, 
    user: { 
     type: UserType, 
     args: { 
      userToken: { type: new GraphQLNonNull(GraphQLString) }, 
      userId: { type: new GraphQLNonNull(GraphQLString) } 
     }, 
     resolve(parentValue, { userToken, userId }) { 
      return UserController.user({ targetUserId: parentValue.user_id, userToken, userId }); 
     } 
    } 
}); 

Das Benutzerfeld auf einem anderen REST-Endpunkt befindet, so muss ich meine Token passieren und User_ID wieder, die erzeugt hässliche Abfragen, wo ich muss permanent args für mein Token und User_id hinzuzufügen.

Gibt es eine Möglichkeit für mich, die in meiner RootQuery übergebenen Argumente zu behalten und sie in meinem Typ wiederzuverwenden? Ich habe in elterlichesWert gesucht, aber sie sind nicht da.

Antwort

1

Das erste Argument, das an den Resolver übergeben wird (parentValue), ist einfach das, was der "Elternteil" des Felds aufgelöst hat - es enthält keine Informationen über die Anfrage selbst oder wie der Wert aufgelöst wurde.

Da GraphQL jede "Ebene" der Anfrage auflöst, bevor Sie fortfahren, können Sie den an jeden Resolver übergebenen Kontext (das dritte Argument) auf einer höheren Ebene ändern, und die Änderungen sind für alle Resolver auf einer niedrigeren Ebene sichtbar .

Zum Beispiel kann der Resolver für eine Abfrage, die eine Foo Typen bekommt:

function (obj, { userToken, userId }, ctx = {}) => { 
    Object.assign(ctx, { userToken, userId }) 
    return getFoo() 
} 

Und dann ein Feld vom Typ Foo könnte wie folgt aussehen:

function (obj, { userToken, userId }, ctx = {}) => { 
    return getBars(ctx.userToken, ctx.userId) 
} 
+0

Danke, wirkt wie ein Zauber! –