Graphql-tools: Using generator/async function in resolver ?

Created on 25 Jul 2017  路  3Comments  路  Source: ardatan/graphql-tools

Today in order to use a generator function in a resolver I do -

const co = require('co');
const resolvers = {
  Query: {
    things: (_, params, context) => co(function * () {
      // consider db.getThings is a generator function 
      return yield db.getThings(params, context);
    }),
}

Is there a different way to do this ? (I repeat this a lot)
Any sense in making resolvers support generator functions (or async) for compatibility ?

Thanks

Most helpful comment

@avnersorek

Query: {
  async things(_, params, context) {
     const elements = await db.getThings()
     return elements
  }

All 3 comments

@avnersorek

Query: {
  async things(_, params, context) {
     const elements = await db.getThings()
     return elements
  }

Thanks @Rennos
So this is expected to work with async but not with generators ?
This does not work for me :

Query: {
  things: function * () {
    const elements = yield db.getThings();
    return elements; // elements is undefined 
  }
}

It does not work with generators 'out of the box'.
I ran my resolvers through this function which wraps the generators using co -

function applyCoToGeneratorResolvers(resolvers) {
  const fixedResolvers = {};

  Object.keys(resolvers).forEach(resolverName => {
    const resolver = resolvers[resolverName];
    if (!_.isFunction(resolver)) {
      fixedResolvers[resolverName] = applyCoToGeneratorResolvers(resolver);
    } else if ('GeneratorFunction' === resolver.constructor.name || 'GeneratorFunction' === resolver.constructor.displayName) {
      fixedResolvers[resolverName] = co.wrap(resolver);
    } else {
      fixedResolvers[resolverName] = resolver;
    }
  });

  return fixedResolvers;
}
Was this page helpful?
0 / 5 - 0 ratings