如何获得GraphQL中的对等字段?

想象一下,我们有GraphQLscheme,其中一些字段依赖于未在父types中parsing的对等字段。 foobar在下面的代码片段中。

 const MyType = new GraphQLObjectType({ name 'MyType' fields { id: { type: GraphQLString // Resolved from parent type }, foo: { type: GraphQLString, description: 'Foo', resolve: function({id}, args, {rootValue:{logger, datasources:{pool}}}) { // Making some queries to database } }, bar: { type: GraphQLString, description: 'Bar', resolve: function({id}, args, {rootValue:{logger, datasources:{pool}}}) { // Making some queries to database } }, baz: { type: GraphQLString, description: 'Baz', resolve: function({id}, args, {rootValue:{logger, datasources:{pool}}}) { // This field actually depends from 'foo' and 'bar' peers. // How to obtain peer fields 'foo' and 'bar to resolve this field? // We have access to 'id' here, but this field resolved from parent type // and we can't access to 'foo' and 'bar' like we do it for 'id'. } } } }) 

如何访问其他同行领域内的这个领域?

每个领域都必须孤立地解决。

 const fooResolver = function(source, args, info) { // Making some queries to database }; const barResolver = function(source, args, info) { // Making some queries to database }; const bazResolver = function(source, args, info) { const foo = fooResolver(source, args, info); const bar = barResolver(source, args, info); // TODO: Resolve baz. }; const MyType = new GraphQLObjectType({ name 'MyType' fields { id: { type: GraphQLString, // Resolved from parent type }, foo: { type: GraphQLString, description: 'Foo', resolve: fooResolver, }, bar: { type: GraphQLString, description: 'Bar', resolve: barResolver, }, baz: { type: GraphQLString, description: 'Baz', resolve: bazResolver, }, }, }); 

您会注意到,如果您获取foobazbar ,则此function性能较差。 要解决这个问题,请使用数据加载器。 例如,使用facebook / dataloader :

 function cacheKeyFn(input) { // Produce a stable cache key string from the input } const fooLoader = new DataLoader(input => { // Return a Promise that fetches `foo` given `input` }, {cacheKeyFn}); const barLoader = new DataLoader(input => { // Return a Promise that fetches `bar` given `input` }, {cacheKeyFn}); const bazLoader = new DataLoader(input => { // Return a Promise that fetches `baz` given `input` }, {cacheKeyFn}); const fooResolver = function(source, args, info) { return await fooLoader.load(source, args, info); }; const barResolver = function(source, args, info) { return await barLoader.load(source, args, info); }; const bazResolver = function(source, args, info) { return await bazLoader.load(source, args, info); }; const bazResolver = function(source, args, info) { const foo = await fooResolver(source, args, info); const bar = await barResolver(source, args, info); return await bazResolver({...source, foo, bar}, args, info); };