graphql抛出未知参数错误

graphql抛出未知参数错误,graphql,Graphql,似乎我没有从graphql中得到一些基本的东西 我试图通过另一个查询的结果来获取用户的id。在本例中,查询某些会话数据 我不明白为什么会发生错误 这是我的密码: { session(key: "558fd6c627267d737d11e758f1ae48cae71fc9b584e2882926ad5470c88d7c3ace08c9c7") { userId expires user(id: userId) { na

似乎我没有从graphql中得到一些基本的东西

我试图通过另一个查询的结果来获取用户的id。在本例中,查询某些会话数据

我不明白为什么会发生错误

这是我的密码:

{
    session(key: "558fd6c627267d737d11e758f1ae48cae71fc9b584e2882926ad5470c88d7c3ace08c9c7") {
        userId
        expires
        user(id: userId) {
            name
        }
    }
}
我得到

类型为“会话”的字段“用户”上的未知参数“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};
        }
    }

}

您需要在type
Session
中的字段
user
上创建一些
解析器
函数,因为GraphQL不知道如何返回
用户
。在
graphqljs
中,它看起来是这样的

const Session=new GraphQLObjectType({
名称:“会话”,
字段:{
用户ID:{type:GraphQLString},
过期:{type:GraphQLString},
用户:{
type:User,//这是您的GraphQL类型
解析:函数(对象、参数、上下文){
//obj是由查询中指定的ID返回的会话对象
//它包含userId和expires属性
//但是,graphql不知道您想要使用userId来检索此会话的用户
//这就是为什么需要在会话类型中为字段用户指定值
返回db.User.findById(obj.userId){
返回用户;
});
}
}
}
});
这只是Node.js中的一个简单示例,向您展示了如何返回
用户
实例。您可以指定如何检索每个GraphQL类型中每个字段的值(每个字段可以有自己的
resolve
函数)

我建议您阅读有关的GraphQL文档

编辑

我将向您展示一个示例,说明如何处理这种情况。让我们考虑两种类型:<代码>用户<代码>和<代码>会话< /代码>

type User {
    _id: String
    name: String
}

type Session {
    expires: String
    user: User
}
如果希望查询返回
会话
对象及其
用户
,则不需要在
会话
类型中包含
用户ID
字段。 你可以用两种方法解决这个问题。第一种方法是对
会话
查询使用单个解析器

{
查询:{
异步会话(parentValue、args、req){
let session=wait adapters.session(args.key);
//现在您有了带有expires和userId属性的会话对象
//为了从查询返回与用户的会话,您只需检索具有userId的用户
let user=wait adapter.users.byId(session.userId);
返回{expires:session.expires,user:user}
}
}
}

这是你的第一选择。使用该解决方案,您可以通过单个查询返回
session
对象,并将
user
分配给该对象,而无需对
session
类型的任何字段使用额外的
resolve
方法。第二种解决方案是我之前展示的,在
会话
类型的字段
用户
上使用
解析
方法-因此您只需告诉GraphQL它应该如何获取该字段的值。

好的,我的错,我认为每个查询都有解析程序。如果没有解析器,程序甚至会在出现此错误消息之前崩溃。但是为了完整性和明确性,我将在上面的代码中添加我的解析器。如果我只是在没有用户的情况下查询会话,那么查询是有效的。还有一件事:我正在使用Apollo的graphql工具进行模式定义,因此它的定义基于graphql类型语言。看看2017年2月23日的附录,我编辑了答案,为您的案例提供了一个示例