2017-04-18 3 views
2

Ich benutze GraphQL und Mungo auf dem Server.Apollo Client Mutationsfehlerbehandlung

Wenn ein Fehler bei der Überprüfung der GraphQL Mutation auftritt, sendet eine Antwort mit dem Statuscode 200 auf der Client-Seite die Antwort wie folgt aussieht:

{ 
 
    "data": null, 
 
    "errors": [{ 
 
    "message": "error for id...", 
 
    "path": "_id" 
 
    }] 
 
}

Ich möchte den Zugang bekommen der Validierungsfehler unter Verwendung der catch-Funktionalität des Apollo-Client-Mutationsversprechens. Etwas wie:

 this.props.deleteProduct(this.state.selectedProductId).then(response => { 
 
     // handle successful mutation 
 
     }).catch(response => { 
 
     const errors = response.errors; // does not work 
 
     this.setState({ errorMessages: errors.map(error => error.message) }); 
 
     });

Wie kann dies geschehen?

+0

versuchen Sie mit 'throw' Anweisung durch Erstellen von' Fehler' Instanz –

Antwort

1

Hinweis: Diese Antwort (und wohl die ganze Frage) ist jetzt veraltet, da in neueren Versionen von Apollo Client Mutationsfehler in catch angezeigt werden.

GraphQL-Fehler aus der Mutation werden derzeit im Feld errors auf der Antwort innerhalb then angezeigt. Ich denke, es ist auf jeden Fall ein Anspruch geltend gemacht werden, dass sie stattdessen in den catch auftauchen sollte, aber hier ist ein Ausschnitt aus einer Mutation von GitHunt:

// The container 
const withData = graphql(SUBMIT_REPOSITORY_MUTATION, { 
    props: ({ mutate }) => ({ 
    submit: repoFullName => mutate({ 
     variables: { repoFullName }, 
    }), 
    }), 
}); 

// Where it's called 
return submit(repoFullName).then((res) => { 
    if (!res.errors) { 
    browserHistory.push('/feed/new'); 
    } else { 
    this.setState({ errors: res.errors }); 
    } 
}); 
+0

Dies funktioniert nicht. Der Fehler wird auf .catch() und nicht auf .then() behandelt. – tgdn

+0

Ja, dieser Kommentar wird vor einer API-Änderung in Apollo Client veröffentlicht. – stubailo

1

Die bisherige Antwort von @stubailo nicht alle Anwendungsfälle scheint zu decken . Wenn ich einen Fehler auf meinem serverseitigen Code erstelle, wird der Antwortcode von 200 verschieden sein und der Fehler wird unter Verwendung von .catch() und nicht unter Verwendung von behandelt.

Link auf das Problem auf GitHub.

Das beste ist wahrscheinlich, den Fehler auf .then() und .catch() zu behandeln.

+1

Ich frage mich, warum es keinen eleganteren Weg gibt, Fehlermeldungen und Fehlercodes zu extrahieren. – Theson