我是GraphQL的新手。我试图传递像这样的对象作为参数:
{
filters: {
status: 'approved',
id: {
LESS_THAN: 200
}
}
}
或者这个对象也可以这样;
{
filters: {
status: ['approved', 'pending'],
id: 200
}
}
我知道可以在此对象中的所有属性,但所有这些属性都可以是字符串/ int或对象。
我试图像这样定义它,但它显然不起作用:
args: {
filters: { type: new GraphQLNonNull(new GraphQLNonNull(GraphQLString)) },
},
我尝试使用GraphQL类型GraphQLInputObjectType
定义参数。
const OffersFiltersType = new GraphQLInputObjectType({
name: 'Filters',
description: '...',
fields: () => ({})
id: {
type: new GraphQLNonNull({
name: 'Id',
description: '...',
fields: {
}
}),
resolve: (offer) => offer.id
},
}),
});
但是我如何指定这种类型我的id可以是int还是对象?
这是我的查询定义:
const QueryType = new GraphQLObjectType({
name: 'Query',
description: '...',
fields: () => ({
offers: {
type: OffersType,
args: {
limit: { type: GraphQLInt },
page: { type: GraphQLInt },
sort: { type: GraphQLString },
filters: { [HERE] }
},
resolve: (root, args, context, info) => {
const gqlFields = graphqlFields(info);
const fields = Object.keys(gqlFields.offer);
const queryArgs = args;
queryArgs.fields = fields;
return getOffers(queryArgs);
}
},
}),
});
这是我对superagent的要求
const getOffers = (args) => {
const queryArgs = args;
if (typeof queryArgs.limit !== 'undefined') {
queryArgs.limit = args.limit;
} else {
queryArgs.limit = Number.MAX_SAFE_INTEGER;
}
return new Promise((fulfill, reject) => {
request
.get(API_URL)
.query(qs.stringify(args))
.end((err, res) => {
if (err) {
reject(err);
}
fulfill(res);
});
});
};
我需要这个对象在我的resolve函数中构造一个查询。感谢大家的帮助!我只需要简单的建议!
答案 0 :(得分:1)
设计不允许这样做:https://github.com/graphql/graphql-js/issues/303
GraphQL不支持未知的属性名称,主要是因为它会使架构变得毫无意义。给出的例子是一个简单的拼写错误:
如果您有查询
query ($foo: String) { field(arg: $foo) }
和变量{ "fooo": "abc" }
,我们目前会将此标记为错误,但如果我们没有引发错误,我们可能会错过此错字。
架构旨在确保服务器和客户端之间的兼容性,甚至跨版本,并且允许未知属性会破坏它。
GraphQL-JS repo中有merge request open for this,但它是still being debated并且在拼写错误和一般不一致方面存在同样的问题。
返回原语或对象的想法遇到了类似的问题。接受对象时,需要列出您期望的属性,查询将根据模式验证这些属性。必须事先知道属性及其类型和null-ness,以便您(和解析器)构建查询,并且在验证时肯定需要知道。
如果您可以接受基元或对象,则必须指定该对象上的字段,但这些字段可能不存在于基元上。那是个问题。