GraphQL Batch
This library is an alternative to batching with dataloader
that works with both graphql
and graphql-tools
.
Note: this is a fork of graphql-resolve-batch
, except we give users finer-grained control of their batching.
import { GraphQLObjectType, GraphQLString } from 'graphql'
import createBatchResolver from 'graphql-batch'
const UserType = new GraphQLObjectType({
});
const QueryType = new GraphQLObjectType({
name: 'Query',
fields: {
user: {
type: UserType,
resolve: createBatchResolver(async (sources, args, [context]) => {
const { db } = context
const users = await db.loadUsersByIds(sources.map(({ id }) => id))
return users
})
}
}
})
Usage
Install graphql-batch
with
$ npm install --save graphql-batch graphql
or
$ yarn add graphql-batch graphql
and import it as
import createBatchResolver from 'graphql-batch';
Examples
- This example batches up requests to
node
into a single request to nodes
const resolve = createBatchResolver(
(roots, argss, [context], [info]) =>
queries['nodes']({}, { ids: argss.map(args => args && args.id) }, context, info),
(parent, args, context, info) =>
`${context.req && context.req.id}${info.fieldNodes[0].name.value}`)
)
return {
Query: {
node: {
resolve
}
}
}
Note: the second parameter is optional and will default to use the first fieldName
as the key:
function defaultCompositeKey(parent, args, context, info) {
return info.fieldNodes[0].name.value
}
Credits