【问题标题】:GraphQL - passing an object of non specific objects as an argumentGraphQL - 将非特定对象的对象作为参数传递
【发布时间】:2017-10-26 07:22:58
【问题描述】:

我对 GraphQL 很陌生。我正在尝试将像这样的对象作为参数传递:

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

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

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

我知道这个对象中的所有属性,但所有这些属性都可以是字符串/整数或对象。

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

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 或 object?

这是我的查询定义:

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

这是我对超级代理的要求

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

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

【问题讨论】:

    标签: javascript node.js graphql graphql-js


    【解决方案1】:

    这是不允许的,根据设计:https://github.com/graphql/graphql-js/issues/303

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

    如果您有查询 query ($foo: String) { field(arg: $foo) } 和变量 { "fooo": "abc" },我们目前将其标记为错误,但如果我们不引发错误,我们可能会错过这个错字。

    架构旨在确保服务器和客户端之间的兼容性,甚至跨版本,并且允许未知属性会破坏这一点。

    GraphQL-JS 存储库中有一个 merge request open for this,但它是 still being debated,并且存在拼写错误和一般不一致的问题。

    返回原语或对象的想法遇到了类似的问题。接受对象时,您需要列出您期望的属性,查询将根据架构验证这些属性。您(和解析器)必须提前知道属性及其类型和空值,以便构建查询,并且在验证时绝对需要知道。

    如果您可以接受原语或对象,则必须指定该对象上的字段,但这些字段不可能存在于原语中。这是个问题。

    【讨论】:

    • 我知道所有属性名称(我会将其添加到我的问题中),但我如何定义参数可以是 int 或对象?
    • 对于数组,您应该要求该字段始终是一个数组,并且只需使用单元素数组。我不认为允许一个字段成为原始或对象也不一定是一个好主意,您可能会要求它始终是一个对象并让一些子字段成为可选的。
    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 2010-12-17
    • 2020-06-05
    • 2016-08-28
    • 2012-07-13
    • 2023-04-02
    相关资源
    最近更新 更多