Ich bin auf eine Kuriosität in dem, was zurückgegeben wird, wenn ich ähnliche Mutationen ausführen. Ich lerne gerade diesen Stapel, und ich implementiere Mongodb mit Mungo als meine Datenbank-Ebene.Graphql Apollo React: Kann nicht Null für nicht Nullable zurückgeben
Ich habe zwei einfache Mutationen. man erstellt einen Benutzer und fügt ihn dem Register Datenbank aka hinzu. der andere fügt offensichtlich ein Profilbild hinzu, nachdem das anfängliche Benutzerobjekt erstellt wurde.
beide Resolver geben das vollständige Benutzerobjekt zurück, was für die Aktualisierung der Benutzerschnittstelle, des Speichers usw. hilfreich ist. Ich plane die Implementierung von Subskriptionen, daher ist es wichtig, dass ich die neuen Daten zurückbekomme.
ich arbeitete mit graphiql aus und rannte in ein seltsames Problem. Mein Update-Resolver gab null zurück, obwohl die Image-URL in der Datenbank gespeichert wurde. Der Register-Resolver gab alle Benutzerfelder zurück.
Bei der Konsolenprotokollierung der Rückgabeobjekte in den Resolvern gaben beide Funktionen ein vollständiges Benutzerobjekt zurück.
Wenn ich versuchte, das Rückgabeobjekt nicht nullbar zu machen, würde ich den Fehler erhalten kann nicht Null für nicht Nullable für den Update-Resolver zurückgeben.
mein Resolver verwendete anfänglich findOneAndUpdate mit einem Callback, der tatsächlich das Benutzerobjekt zurückgab. und ja, ich wurde immer noch null. seltsam.
ich änderte meinen Resolver zu einem eher manuellen Ansatz. Ich suche den bestehenden Benutzer mit findOne übergeben in der Benutzer-ID, dann explizit sagen user.profilePic = "url of pic" und das aufrufende Speichern des gesamten Benutzerobjekts und die Rückgabe des Benutzerobjekts im Callback zu diesem. und Boom, das funktioniert!
Was verursacht das also? Ich habe das anfängliche Gefühl, dass dies etwas mit Timing zu tun hat, irgendwie auch mit dem Warten auf den Callback .... ich verstehe wirklich nicht, warum meine erste Annäherung nicht funktioniert und meine zweite tut es. Ich werde den Code für beide vielleicht jemand mit einem tieferen Verständnis von Timing oder möglicherweise async Funktionen kann Chime in. Vielleicht muss ich meinen Stil von Callbacks zu versprechen oder async erwarten.
//this one doesnt work
addProfilePic: (root, { input }, context) => {
let update = { profilePic: input.profilePic };
let query = { id: input.id };
let options = { new: true, upsert: true};
let callback = ((err, user) => {
if(err) console.log(err.message);
return user;
})
return updatedUser = User.findOneAndUpdate(query, update, options, callback)
}
//this one works, but returns old user object to client...
//so really, no, it doesn't work
addProfilePic: (root, { input }, context) => {
return User.findOne({id: input.id}, ((err,user) => {
if(err)console.log(err);
if(user){
user.profilePic = input.profilePic;
user.save((err) => {
if(err)console.log(err);
console.log(user);
return user;
})
}
})
})
Anmerkung: in Zusammenhang vorbei, wenn ich implementieren tatsächlich werde ich id aus dem Kontext erhalten, die den Benutzer enthält, wenn sie angemeldet sind . Anmerkung: diese sind bald coole Tools, aber viel zu lernen, vor allem für jemanden mit 3 Monaten Gesamtcodierung exp ... dh ich ...
Sie haben Recht, ich erkannte, dass ich mein ursprüngliches findOne Benutzerobjekt zurückgab, obwohl graphiql die korrekten aktuellen Daten anzeigte. Ich mag dieses Muster auch für Fehler, es wird mühsam, wie ich es gemacht habe. Ich habe es schwer gefunden, Standardmuster für diesen Stapel zu finden. sehr hilfreicher Rat. – benjaminadk
@benjaminadk [Dies ist eine kuratierte Liste von GraphQL-Beispielen] (https://github.com/chentsulin/awesome-graphql). Da ist ein Paar, das Mungo benutzt, das du vielleicht hilfreich findest. –