graphql抛出未知参数错误

时间:2017-02-22 19:12:57

标签: graphql

好像我没有得到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};
        }
    }

}

1 个答案:

答案 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

的GraphQL文档

修改

我将向您展示如何处理这种情况。我们考虑两种类型:UserSession

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它应如何获取此字段的值。