2015-11-20 29 views
5

Errore di inseguimento. quando si tenta di eseguire una mutazione tramite graphiql. Per favore aiutami a risolvere questo problema o indicare un collegamento dove posso trovare esempio di mutazioni a relè di reazione.Impossibile impostare la proprietà "clientMutationId" di indefinito

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 
     } 
     ] 
    } 
    ] 
} 

Ecco la definizione di mutazione

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

L'errore è quasi certamente perché non si sta caricando un utente correttamente. Probabilmente perché stai solo inviando un nome utente come input. –

+0

Posso console log nuovo utente in mutateAndGetPayload ma stranamente risolvere la funzione in outputFields non è in esecuzione. – user1762608

+0

potrebbe non essere una query per l'utente. Se non si richiede un campo, la funzione di risoluzione del campo di output non viene chiamata. –

risposta

11

Devi ritorno qualcosa da mutateAndGetPayload - nel suo caso, una promessa.

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

Inoltre, non sono sicuro che si desideri restituire un payload null se si verifica un errore. Probabilmente vuoi lanciare in modo che l'errore possa esplodere attraverso il tuo webstack e uscire a Relay in modo che la mutazione sul lato client possa sapere che la mutazione è fallita. – steveluscher

+0

Nel mio caso ho una seconda promessa all'interno di quella che viene restituita. E la seconda promessa è respinta. Ciò causa l'errore "Impossibile impostare la proprietà 'clientMutationId' di undefined" è di nuovo visto. Non sei sicuro di quale sia il modo migliore per gestirlo. – runios

+1

Ok mio male. Un errore stupido nel mio codice. Il ritorno era nel mio "allora" della promessa. Non stavo tornando dal flusso principale. – runios

Problemi correlati