【问题标题】:Graphql find user by username or emailGraphql 通过用户名或电子邮件查找用户
【发布时间】:2018-09-11 20:59:42
【问题描述】:

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

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 个查询会非常痛苦) ?

【问题讨论】:

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

标签: graphql graphql-js


【解决方案1】:

你可以这样解决:


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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      您可以像这样解决您的查询

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        • 2016-09-16
        • 1970-01-01
        • 1970-01-01
        • 2021-01-01
        • 1970-01-01
        • 2019-08-18
        相关资源
        最近更新 更多