好像我没有得到graphql的基本功能。
我试图通过它的id来获取用户,而id又是另一个查询的结果。在这种情况下,查询一些会话数据。
我不明白为什么会发生错误。
这是我的代码:
{
session(key: "558fd6c627267d737d11e758f1ae48cae71fc9b584e2882926ad5470c88d7c3ace08c9c7") {
userId
expires
user(id: userId) {
name
}
}
}
我得到了
“会话”类型字段“user”上的未知参数“id”
我的架构如下所示:
type Session {
userId: String,
expires: String,
user: User
}
type User {
_id: String
name: String
email: String
firstName: String
lastName: String
}
type Query {
session(key: String!): Session
user(id: String!): User
}
附录2017年2月23日
我很抱歉我在最初的帖子中没有充分明确相应的解析器。是的,我的解析器是定义的和e。 G。如果我不添加用户,则查询适用于会话。
这是我的根:
{
Query: {
async user(parentValue, args, req) {
let user = await adapters.users.byId(args.id);
return user;
},
async session(parentValue, args, req) {
let session = await adapters.session(args.key);
let userId = session.session.userId;
let expires = session.expires;
return {userId: userId, expires: expires};
}
}
}
答案 0 :(得分:0)
您需要在resolver
类型的字段user
上创建一些Session
函数,因为GraphQL不知道如何返回user
。在graphql-js
中,它看起来像那样
const Session = new GraphQLObjectType({
name: 'Session',
fields: {
userId: { type: GraphQLString },
expires: { type: GraphQLString },
user: {
type: User, // it is your GraphQL type
resolve: function(obj, args, context){
// obj is the session object returned by ID specified in the query
// it contains attributes userId and expires
// however graphql does not know you want to use the userId in order to retrieve user of this session
// that is why you need to specify the value for field user in type Session
return db.User.findById(obj.userId).then(function(user){
return user;
});
}
}
}
});
这只是Node.js的一个简单示例,向您展示如何返回user
实例。您可以指定如何检索每个GraphQL类型中每个字段的值(每个字段都可以拥有它自己的resolve
函数)。
我建议您阅读有关root and resolvers
修改强>
我将向您展示如何处理这种情况。我们考虑两种类型:User
和Session
type User {
_id: String
name: String
}
type Session {
expires: String
user: User
}
如果您希望查询将Session
对象与User
一起返回,则无需在userId
类型中包含Session
字段。
您可以通过两种方式解决这种情况。第一个是对session
查询使用单个解析器。
{
Query: {
async session(parentValue, args, req) {
let session = await adapters.session(args.key);
// now you have your session object with expires and userId attributes
// in order to return session with user from query, you can simply retrieve user with userId
let user = await adapter.users.byId(session.userId);
return { expires: session.expires, user: user }
}
}
}
这是您的第一选择。使用该解决方案,您可以通过单个查询返回session
对象user
,并在resolve
类型的任何字段上不使用额外的Session
方法。第二个解决方案是我之前显示的解决方案,您在resolve
类型的字段user
上使用Session
方法 - 因此您只需告诉GraphQL它应如何获取此字段的值。