如何设置 GraphQL 查询,以便需要一个或另一个参数,但不是两者都需要

Posted

技术标签:

【中文标题】如何设置 GraphQL 查询,以便需要一个或另一个参数,但不是两者都需要【英文标题】:How do I set up GraphQL query so one or another argument is required, but not both 【发布时间】:2018-02-21 12:20:50 【问题描述】:

我刚刚开始掌握 GraphQL,

我设置了以下查询: ​

type: UserType,
args: 
    id:     name: 'id',    type: new GraphQLNonNull(GraphQLID)     ,
    email:  name: 'email', type: new GraphQLNonNull(GraphQLString) 
,
resolve: (root,  id, email ,  db:  User  , fieldASTs) => 
    ...

我希望能够将“id”或“email”传递给查询,但是,通过此设置,它需要同时传递 id 和电子邮件。

有没有办法设置查询,因此只需要一个参数,id 或 email,但不能同时使用?

【问题讨论】:

github.com/graphql/graphql-js/blob/master/src/__tests__/… 【参考方案1】:

GraphQL 中没有内置的方法可以做到这一点。您需要使您的参数可以为空(通过从它们中删除 GraphQLNonNull 包装器类型),然后在您的解析器中,您可以进行如下检查:

resolve: (root,  id, email ,  db:  User  , fieldASTs) => 
  if (!id && !email) return Promise.reject(new Error('Must pass in either an id or email'))
  if (id && email) return Promise.reject(new Error('Must pass in either an id or email, but not both.'))
  // the rest of your resolver

【讨论】:

【参考方案2】:

定义一个接口credentials 并将其实现为idemail

【讨论】:

输入类型不能实现接口

以上是关于如何设置 GraphQL 查询,以便需要一个或另一个参数,但不是两者都需要的主要内容,如果未能解决你的问题,请参考以下文章

如何在 graphQL 中编写 JOIN 或从多种类型中获取结果 - AWS App sync iOS

Mysql:优化使用一列或另一列的查询

根据另一列的另一个值和/或另一行中的同一列更新设置值:-ORA 1427

如何使用碎片化文档验证 graphql 模式

如何使用 apollo / graphql 实现节点查询解析器

如何将查询逻辑添加到基于 graphql-sequelize 的设置?