对于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);
}
}
});
答案 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支持。