GraphQL:在查询中至少需要一个参数

Nor*_*ert 6 javascript graph

我为我的用户查询设置了以下架构:

{
  type: UserType,
  args: {
    id: {
        type: GraphQLID,
        description: "A user's id.",
    },
    email: {
        type: GraphQLString,
        description: "A user's email.",
    },
},
resolve: async (parent, args) => {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

我想同时接受idemail作为参数,但至少需要一个。有没有办法在模式中设置它,而不必在解析函数中编写额外的代码?

还是建议为每个参数创建单独的查询?例如:getUserByIdgetUserByEmailgetUserBySessionToken,等?

Tal*_*yev 7

我认为使用解析功能的最简单方法。但为什么你认为它会很乱?

try {
  if(!args.id && !args.email) {
    throw new Error('Specify id or email');
  }
  ...
} catch(e) {
  return Promise.reject(e);
}
Run Code Online (Sandbox Code Playgroud)


Ary*_*rog 5

如果您想要一个强制执行两者之一的架构,您可以添加一个 enum 参数来限定单个字符串参数。graphql 中的模式可能如下所示:

type query {
  getUser(
    lookup: String!
    lookupType: UserLookupType!
  ): User
}

enum UserLookupType {
  ID
  EMAIL
}
Run Code Online (Sandbox Code Playgroud)