GraphQL – 传递非特定对象的对象作为参数

我对GraphQL很新颖。 我试图传递一个这样的对象作为参数:

{ filters: { status: 'approved', id: { LESS_THAN: 200 } } } 

或者这个对象也可以是这样的;

 { filters: { status: ['approved', 'pending'], id: 200 } } 

我知道可以在此对象中的所有属性,但所有这些属性可以是string/ int或对象。

我试图这样定义它,但它显然不工作:

 args: { filters: { type: new GraphQLNonNull(new GraphQLNonNull(GraphQLString)) }, }, 

我想用GraphQLtypesGraphQLInputObjectType来定义参数。

 const OffersFiltersType = new GraphQLInputObjectType({ name: 'Filters', description: '...', fields: () => ({}) id: { type: new GraphQLNonNull({ name: 'Id', description: '...', fields: { } }), resolve: (offer) => offer.id }, }), }); 

但是,我怎么能指定这种types,我的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); }); }); }; 

我需要这个对象在我的parsing函数中构造一个查询。 感谢大家的帮助! 我只需要简单的build议!

这是不允许的,通过devise: https : //github.com/graphql/graphql-js/issues/303

GraphQL不支持未知的属性名称,主要是因为它会使模式变得毫无意义。 给出的例子是一个简单的错字:

如果您有查询query ($foo: String) { field(arg: $foo) }和variables{ "fooo": "abc" } ,我们当前将其标记为错误,但是如果有错误我们没有提出错误。

架构旨在确保服务器和客户端之间的兼容性,即使在不同版本之间,允许未知属性也会打破这一点。

在GraphQL-JS库中有一个合并请求 ,但是它仍然在争论中,并且存在与input错误和一般不一致的问题。

返回一个基元或对象的想法会遇到类似的问题。 当接受一个对象时,你需要列出你期待的属性,查询将根据这个模式validation这些属性。 必须提前知道属性及其types和空值,以便您(和parsing器)构build查询,并且在validation时肯定需要知道。

如果你可以接受一个原始对象或者对象,那么你必须指定那个对象上的字段,但是那些不可能存在于这个原语中。 这是一个问题。