3

我一直在为 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);
      }
    }
  });
4

7 回答 7

1

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

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

于 2016-09-25T02:50:19.410 回答
0

嗯,我找到了。我浏览了更新日志,它被更改为第三个参数的一部分。但是,它的结构不同

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

  //now its simply
  fieldASTs.reduce(someLogic);
}
于 2015-10-22T12:24:39.047 回答
0

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

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);
      }
    }
  });

这为我解决了。

于 2016-11-06T10:43:15.077 回答
0

有 2 个相互竞争的开源库可以实现初学者所要求的主题:

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

于 2019-01-03T16:22:15.053 回答
0

我是graphql的新手,但这为我解决了这个问题,我认为版本中可能发生了一些变化,因为options(第4个参数)对象上不存在fieldASTs,但是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()
    }
}

于 2018-01-06T14:08:15.693 回答
0

作为express-graphqlgraphql v0.8.1,我必须这样做(也请注意猫鼬的使用):

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();
  }
于 2016-12-21T19:20:23.667 回答
0

我正在使用graphql@0.4.14,并在这里找到它:

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

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

于 2015-12-13T00:01:12.097 回答