Graphql通过用户名或电子邮件查找用户

Graphql通过用户名或电子邮件查找用户,graphql,graphql-js,Graphql,Graphql Js,我有一个简单的模式: type User { _id: String, username: String, age: Int, email: String, password: String, } type Query { user(_id: String!): User, } 解析程序: import User from './User'; export default

我有一个简单的模式:

type User {
        _id: String,
        username: String,
        age: Int,
        email: String,
        password: String,
    }
    type Query {
        user(_id: String!): User,
    }
解析程序:

import User from './User';

export default {
    Query: {
        user: (_, { _id }) => User.findById(_id),
    },
}

如何通过一些指定字段(如
username
email
)获取用户,而不为每个字段创建查询函数(如果用户有1000个唯一字段,则为每种类型创建1000个查询将非常痛苦)?

如果参数的名称与字段的名称匹配,将整个
args
对象作为参数传递给
find()
findOne()
非常简单:

在本例中,您将获得与传入的参数匹配的第一个用户并返回它。如果要返回所有可能的匹配项,可以有两个单独的查询,一个返回单个用户,另一个返回用户列表:

Query: {
  user: (_, args) => User.findOne(args),
  users: (_, args) => User.find(args),
},
如果有任何参数需要以不同的方式处理(例如,如果希望传入限制或添加某种分页),则始终可以使用帮助程序库,如
lodash
ramda
,来提取这些参数。例如:

users: (_, args) => {
  const where = omit(args, ['limit'])
  const limit = args.limit || 10
  return User.find(where).sort({'someField': -1}).limit(limit).exec()
}

您可以这样解决您的查询

查询:{
用户:(\uz,args)=>user.findOne({
其中:{
电子邮件:“您的搜索值”
}
}),
},
查询:{
用户:(\uz,args)=>user.findOne({
其中:{
用户名:“您的搜索值”
}
}),

},
您可以这样解决它:


  Query: {
    async getPosts(_, { username }) {
      try {
        const posts = await Post.find({ username: username });
        return posts;
      } catch (err) {
        throw new Error(err);
      }
    },
  },


更新此问题以包含更多详细信息将有所帮助。存储层使用的是什么?如果您使用的是数据库,那么您使用什么ORM或查询生成器来与之交互?你已经试过什么了?查看用户查询的解析器也可能会有所帮助。我使用apollo server和Mongodb进行存储,我使用解析器函数更新了问题。

  Query: {
    async getPosts(_, { username }) {
      try {
        const posts = await Post.find({ username: username });
        return posts;
      } catch (err) {
        throw new Error(err);
      }
    },
  },