2017-08-02 4 views
0

Gemäß die Dokumentation hier, das zweite Argument auf eine Resolver-Funktion in der Bibliothek graphql-Tool ist ein Objekt in dieArgumente zu graphql-tools Mutation Resolver ist kein Objekt in v> 0.8.0?

http://dev.apollodata.com/tools/graphql-tools/resolvers.html#Resolver-function-signature

jedoch Abfrage übergeben, wenn ich graphql-Tools mit einer Version von graphql laufe > = 0.8.0, das als zweites Argument übergebene "Objekt" fehlt einige Objekteigenschaften. Zum Beispiel sind arg.constructor und arg.hasOwnProperty nicht definiert.

In der vorherige Version, 0.7.2, beide diese Aussagen wahr bewerten würden:

arg.consructor === Object 
arg.hasOwnProperty === 'function' 

Wer weiß, was tatsächlich als zweites Argument übergeben zu werden, oder warum diese Eigenschaften, die in der Regel auf JS existieren Objekte sind undefiniert?

bearbeiten unter:

ich damit, indem Sie so etwas wie dies zu erreichen:

async resolverFuncForMutation(root, nonObjArgs, context) { 
    const args = Object.assign({}, nonObjArgs); 

Aber ich will nicht zu haben, sich daran zu erinnern, wie zu tun, dass für jede Resolver-Funktion. Weiß jemand, wie es funktioniert, wenn es eine Möglichkeit gibt, das in einer Art Vorauflösung zu konfigurieren?

Antwort

1

Looking at the source code, es sieht aus wie vor 0.8.0, das Objekt, das an die Resolverfunktion übergeben wurde, wurde als {} initialisiert. Jetzt wird es als Object.create(null) initialisiert.

Sie erhalten noch ein Objekt, aber wenn Object.create(null) verwendet wird, wird das resultierende Objekt nicht von einem Prototyp, während {} erbt von dem Object Prototyp erben. Methoden wie hasOwnProperty und toString gehören eigentlich zum Prototyp, nicht Objekte selbst. Während die meisten Objekte (kleines "O") Instanzen von Objekt (großes "O") sein werden, ist dies nicht unbedingt der Fall, wie Sie hier herausgefunden haben.

Es gibt einige gute Diskussion here herum, warum Object.create(null) oft bevorzugt wird.

Soweit ich weiß, gibt es keine Möglichkeit, die Argumente zu ändern, bevor sie an den Resolver in der Art weitergegeben werden, wie Sie möchten. wenn Sie sie benötigen jedoch nur ein Objekt sein hasOwnProperty zu nutzen, kann es einfacher sein, nur Ihren Code ein wenig Refactoring, dh statt:

if (foo.hasOwnProperty('bar')) doSomething() 

Sie können nur tun

if (foo.bar) doSomething() 
+0

Dank Mann, das ist es! Leider hatte ich einige Drittanbieter-Bibliotheken aufrufen hasOwnProperty, ect. über die Argumente. Ich habe einen kleinen Präprozessor für meine Resolver-Funktionen geschrieben, um die Datenstruktur von Argumenten zu durchlaufen und etwas wie args = 'Object.assign ({}, args)' aufzurufen. Lief wie am Schnürchen – albertlockett