GraphQL上的fieldAST解析

时间:2015-10-22 12:15:37

标签: graphql

对于GraphQL,我一直在疯狂。我已经看到很多资源引用了selectionSet的最后一个fieldASTs参数。但是,它似乎并不存在。我没有找到任何确凿的证据,但它已经在github问题和教程中提出。我有点困惑。是否存在第四个参数?

我还测试了其他参数,看看我是否可以将它从那些中删除。

 const SomeType = new GraphQLObjectType({
     name: 'SomeObject',
     fields: () => ({
         someItems : {
         type: new GraphQLList(SomeCustomType),
         resolve: (someItems, params, source, fieldASTs) => {
             const projections = getProjection(fieldASTs);
             return SomeModel.find({}, projections);
      }
    }
  });

7 个答案:

答案 0 :(得分:1)

当前版本(0.7.0),现在它在第四个参数中,第三个参数用于上下文。

此博客文章中的以下观察可能有所帮助。 http://pcarion.com/2015/09/27/GraphQLResolveInfo/

答案 1 :(得分:0)

Welp,我找到了。我浏览了更改日志,并将其更改为第三个参数的一部分。但是,它的结构方式不同

resolve: (item, params, info, fieldASTs) => {
  //used to be
  fieldASTs.selectionMap.selection.reduce(someLogic);

  //now its simply
  fieldASTs.reduce(someLogic);
}

答案 2 :(得分:0)

我正在使用graphql@0.4.14,并在此处找到它:

info //third argument
.fieldASTs[0]
.selectionSet
.selections
//.reduce...

我猜他们仍然在改变一切,所以我已经将{try / catch添加到了getProjection()

答案 3 :(得分:0)

是的,第四个参数由fieldAST组成,但它作为数组挂在对象下

const SomeType = new GraphQLObjectType({
     name: 'SomeObject',
     fields: () => ({
         someItems : {
         type: new GraphQLList(SomeCustomType),
         resolve: (someItems, params, source, options) => {
             const projections = getProjection(options.fieldASTs[0]);
             return SomeModel.find({}, projections);
      }
    }
  });

这为我解决了。

答案 4 :(得分:0)

express-graphql是graphql v0.8.1我必须这样做(注意也使用mongoose):

function getProjection (fieldASTs) {
  return fieldASTs.fieldNodes[0].selectionSet.selections.reduce((projections, selection) => {
    projections[selection.name.value] = 1;

    return projections;
  }, {});
}

resolve (root, params, info, fieldASTs) {

    let filter = {};

    if(params._id){
      filter._id = params._id;
    }

    var projections = getProjection(fieldASTs);
    return grocerModel.find(filter).select(projections).exec();
  }

答案 5 :(得分:0)

我是graphql的新手,但这解决了它,我认为版本中的某些内容可能已更改,因为在选项(第4个参数)对象上不存在fieldAST,但是fieldNodes确实有必要执行的子对象预测。

export default {
    type: new GraphQLList(teamType),
    args: {
        name: {
            type: GraphQLString
        }
    },
    resolve(someItems, params, source, options) {

        const projection = getProjection(options.fieldNodes[0])

        return TeamModel
            .find()
            .select(projection)
            .exec()
    }
}

答案 6 :(得分:0)

有2个相互竞争的开放源代码库来实现入门者要求的主题:

他们都试图解决相同的问题,但是前者似乎具有更多功能,包括开箱即用的TypeScript支持。