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