2015-11-20 4 views
5

Ich erhalte folgenden Fehler. wenn Sie versuchen, eine Mutation über graphiql auszuführen. Bitte helfen Sie mir, dieses Problem zu lösen oder zeigen Sie auf einen Link, wo ich zum Beispiel react relay-Mutationen finden kann.Kann die Eigenschaft 'clientMutationId' nicht definiert werden

mutation { 
    createUser(input: {username: "Hamza Khan", clientMutationId: ""}) { 
    user { 
     id 
     username 
    } 
    } 
} 

{ 
    "data": { 
    "createUser": null 
    }, 
    "errors": [ 
    { 
     "message": "Cannot set property 'clientMutationId' of undefined", 
     "locations": [ 
     { 
      "line": 17, 
      "column": 2 
     } 
     ] 
    } 
    ] 
} 

ist die Mutation Definition

import { 
    GraphQLString, 
    GraphQLInt, 
    GraphQLFloat, 
    GraphQLList, 
    GraphQLObjectType, 
    GraphQLID, 
    GraphQLNonNull 
} from 'graphql'; 

import { 
    connectionArgs, 
    connectionDefinitions, 
    connectionFromArray, 
    fromGlobalId, 
    globalIdField, 
    mutationWithClientMutationId, 
    nodeDefinitions, 
} from 'graphql-relay'; 

import {User} from './usermodel'; 
import {UserType} from './usertype'; 

export const UserMutations = {}; 
UserMutations.createUser = mutationWithClientMutationId({ 
    name: 'CreateUser', 
    inputFields: { 
    username: {type: new GraphQLNonNull(GraphQLString)} 
    }, 
    outputFields: { 
    user: { 
     type: UserType, 
     resolve: (payload) => { 
     return User.getUserById(payload.userId); 
     } 
    } 
    }, 
    mutateAndGetPayload: (args) => { 
    let newUser = new User({ username: args.username }); 
    newUser.save().then((user) => { 
     return {userId: user.id}; 
    }).error((err) => {return null;}); 
    } 
}); 
+0

Der Fehler ist fast sicher, weil Sie einen Benutzer nicht korrekt laden. Wahrscheinlich, weil Sie nur einen Benutzernamen als Eingabe senden. –

+0

Ich kann neue Benutzer in muateAndGetPayload trösten, aber seltsam lösen Funktion in outputFields wird nicht ausgeführt. – user1762608

+0

es könnte sein, dass Sie nicht für Benutzer abfragen. Wenn Sie kein Feld anfordern, wird die Auflösungsfunktion des Ausgabefelds nicht aufgerufen. –

Antwort

11

Sie zu Rückkehr haben etwas von mutateAndGetPayload - in Ihrem Fall ein Versprechen.

mutateAndGetPayload: ({username}) => { 
    const newUser = new User({username}); 
    return newUser.save().then(user => ({userId: user.id})); 
} 
+0

Außerdem bin ich nicht sicher, ob Sie eine Null-Payload zurückgeben möchten, wenn ein Fehler auftritt. Sie möchten wahrscheinlich so werfen, dass der Fehler durch Ihren Webstack und zu Relay aufsteigen kann, sodass die clientseitige Mutation erkennen kann, dass die Mutation fehlgeschlagen ist. – steveluscher

+0

In meinem Fall habe ich ein zweites Versprechen innerhalb des zurückgegebenen. Und das zweite Versprechen wird abgelehnt. Das verursacht den Fehler "Kann die Eigenschaft 'clientMutationId' von undefined nicht festlegen" wird wieder angezeigt. Nicht sicher, was der beste Weg ist, damit umzugehen. – runios

+1

Ok mein Schlechter. Ein dummer Fehler in meinem Code. Die Rückkehr war in meinem "Damals" der Verheißung. Ich kam nicht aus dem Hauptstrom zurück. – runios

Verwandte Themen