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

Graphql find user by username or email

所以我有这个简单的架构:

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

如何通过 usernameemail 等指定字段获取用户,而无需为每个字段创建查询函数(如果用户有 1000 个唯一字段,那将是非常痛苦的)为每种类型创建 1000 个查询)?

如果参数的名称与字段的名称相匹配,则可以很容易地将整个 args 对象作为参数传递给 find()findOne():

Query: {
  user: (_, args) => User.findOne(args),
},

在这种情况下,您将获得第一个匹配传入参数的用户,并 return 它。如果您想 return 所有可能的匹配项,您可以有两个单独的查询,一个 return 单个用户,另一个 return 用户列表:

Query: {
  user: (_, args) => User.findOne(args),
  users: (_, args) => User.find(args),
},

如果有任何参数需要区别对待(例如,如果你想传入一个限制或添加某种分页),你总是可以使用像 lodashramda 仅提出这些论点。例如:

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

您可以这样解决您的查询

Query: {
    user: (_, args) => User.findOne({
      where: {
        email: "Your search value"
      }
    }),
  },

  Query: {
    user: (_, args) => User.findOne({
      where: {
        username: "Your search value"
      }
    }),
  },

你可以这样解决:


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