2016-08-04 21 views
4

ich folgende Schema gleiche wie hereUnable Liste holen in reagieren Relais

erwähnte ich alle Benutzer holen möchte ich wie dieses

var Root = new GraphQLObjectType({ 
    name: 'Root', 
    fields:() => ({ 
    user: { 
     type: userType, 
     resolve: (rootValue, _) => { 
     return getUser(rootValue) 
     } 
    }, 
    post: { 
     type: postType, 
     args: { 
     ...connectionArgs, 
      postID: {type: GraphQLString} 
     }, 
     resolve: (rootValue, args) => { 
     return getPost(args.postID).then(function(data){ 
     return data[0]; 
     }).then(null,function(err){ 
     return err; 
     }); 
     } 
    }, 

    users:{ 
     type: new GraphQLList(userType), 
     resolve: (root) =>getUsers(), 
    }, 
    }) 
}); 

mein Schema so aktualisiert und in database.js

export function getUsers(params) { 
    console.log("getUsers",params) 
    return new Promise((resolve, reject) => { 
     User.find({}).exec({}, function(err, users) { 
     if (err) { 
      resolve({}) 
     } else { 
      resolve(users) 
     } 
     }); 
    }) 
} 

ich erhalte Ergebnisse in/graphql als

{ 
    users { 
    id, 
    fullName 
    } 
} 

und Ergebnisse als

{ 
    "data": { 
    "users": [ 
     { 
     "id": "VXNlcjo1Nzk4NWQxNmIwYWYxYWY2MTc3MGJlNTA=", 
     "fullName": "Akshay" 
     }, 
     { 
     "id": "VXNlcjo1Nzk4YTRkNTBjMWJlZTg1MzFmN2IzMzI=", 
     "fullName": "jitendra" 
     }, 
     { 
     "id": "VXNlcjo1NzliNjcyMmRlNjRlZTI2MTFkMWEyMTk=", 
     "fullName": "akshay1" 
     }, 
     { 
     "id": "VXNlcjo1NzliNjgwMDc4YTYwMTZjMTM0ZmMxZWM=", 
     "fullName": "Akshay2" 
     }, 
     { 
     "id": "VXNlcjo1NzlmMTNkYjMzNTNkODQ0MmJjOWQzZDU=", 
     "fullName": "test" 
     } 
    ] 
    } 
} 

aber Wenn ich versuche, dies als

export default Relay.createContainer(UserList, { 
    fragments: { 
    userslist:() => Relay.QL` 
     fragment on User @relay(plural: true) { 
      fullName, 
      local{ 
       email 
      }, 
      images{ 
       full 
      }, 
      currentPostCount, 
      isPremium, 
     } 
    `, 
    }, 
}); 

Fehler Ich erhalte Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.

Bitte sagen Sie mir in Aussicht zu holen, was mir fehlt. Ich habe viel mit und ohne @relay (Plural: True) versucht. versuchten auch Schema mit Argumenten zu aktualisieren, da

users:{ 
     type: new GraphQLList(userType), 
     args: { 
     names: { 
      type: GraphQLString, 
     }, 
     ...connectionArgs, 
     }, 
     resolve: (root, {names}) =>connectionFromArray(getUsers(names)), 
    }, 

aber ich habe Fehler Cannot read property 'after' of undefined in implementing react-relay Vielen Dank im Voraus.

+0

Wo definieren Sie 'userslist'? –

+0

Ich definierte Benutzerliste in routes.js – akshay

+0

Relay.ql '{users} – akshay

Antwort

6

Relay unterstützt derzeit nur drei Arten von Wurzelfeldern (siehe facebook/relay#112):

  • Wurzel Feld ohne Argumente, einen einzelnen Knoten zurückkehr:
    • z.B. { user { id } }{"id": "123"}
  • Wurzelkörper mit einem Argument zurückkehrt, einen einzelnen Knoten zurückkehr:
    • z.B. { post(id: "456") { id } } Rückkehr {"id": "456"}
  • Startfeld mit einem Array Argumente ein Array von Knoten mit der gleichen Größe wie das Argument zurückkehr Array (auch als "root mehrere Identifiziereinheiten Feld" bekannt):
    • z.B. { users(ids: ["123", "321"]) { id } }[{"id": "123"}, {"id": "321"}]

einer Vermeidung des Problems der Rückkehr ist eine Wurzel Feld zu erzeugen Zurückgeben eines Knotens (oft viewer bezeichnet), die diese Felder. Wenn sie innerhalb des (oder eines anderen Knotens) verschachtelt sind, dürfen Felder jeden Rückgabetyp haben, einschließlich einer Liste oder Verbindung. Wenn Sie die Felder in diesem Objekt in Ihrem GraphQL Server eingewickelt haben, können Sie sie wie folgt abfragen:

{ 
    viewer { 
    users { 
     id, 
     fullName, 
    } 
    } 
} 

Der Viewer Typ ist ein Knotentyp, und da gibt es nur eine Instanz davon sein wird, seine id sollte eine Konstante sein.Sie können die globalIdField Helfer nutzen die id Feld zu definieren, und fügen Sie alle anderen Felder, die Sie mit Relay abfragen möchten:

const viewerType = new GraphQLObjectType({ 
    name: 'Viewer', 
    interfaces: [nodeInterface], 
    fields: { 
    id: globalIdField('Viewer',() => 'VIEWER_ID'), 
    users:{ 
     type: new GraphQLList(userType), 
     resolve: (viewer) => getUsers(), 
    }, 
    }, 
}); 

Auf dem Client werden Sie die Root-Abfrage in Ihrer Route { viewer } ändern müssen und definieren das Fragment auf :

export default Relay.createContainer(UserList, { 
    fragments: { 
    viewer:() => Relay.QL` 
     fragment on Viewer { 
     users { 
      fullName, 
      local { 
      email, 
      }, 
      images { 
      full, 
      }, 
      currentPostCount, 
      isPremium, 
     } 
     } 
    `, 
    }, 
}); 
+0

Wie sollte der Viewer in meinem Schema aussehen? – akshay

+0

@akshay Ich habe jetzt eine Beispiel-Viewer-Typdefinition zu meiner Antwort hinzugefügt. – fson

+1

Danke es woks wie Charme .. :-) – akshay