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

时间:2018-04-02 16:14:06

标签: 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 {
    Query: {
        user: (_, { _id }) => User.findById(_id),
    },
}

如何通过某些指定字段(例如usernameemail获取用户而不为每个字段创建查询功能(如果用户有1000个唯一字段,那么创建1000将非常痛苦)查询每种类型)?

3 个答案:

答案 0 :(得分:2)

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

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

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

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

如果有任何参数需要区别对待(例如,如果您想传入限制或添加某种分页),您可以始终使用辅助库,如lodash或{{只提出那些论点。例如:

ramda

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

你可以这样解决:


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