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),
},
}
如何通过 username
、email
等指定字段获取用户,而无需为每个字段创建查询函数(如果用户有 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),
},
如果有任何参数需要区别对待(例如,如果你想传入一个限制或添加某种分页),你总是可以使用像 lodash
或ramda
仅提出这些论点。例如:
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);
}
},
},
所以我有这个简单的架构:
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),
},
在这种情况下,您将获得第一个匹配传入参数的用户,并 return 它。如果您想 return 所有可能的匹配项,您可以有两个单独的查询,一个 return 单个用户,另一个 return 用户列表:
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()
}
您可以这样解决您的查询
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);
}
},
},