graphql 抛出未知参数错误
Posted
技术标签:
【中文标题】graphql 抛出未知参数错误【英文标题】:graphql throws unknown argument error 【发布时间】:2017-07-13 00:31:17 【问题描述】:似乎我没有得到有关 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;
【问题讨论】:
【参考方案1】:您需要在Session
类型的字段user
上创建一些resolver
函数,因为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 文档
编辑
我将向您展示如何处理这种情况的示例。让我们考虑两种类型:User
和 Session
type User
_id: String
name: String
type Session
expires: String
user: User
如果您希望查询返回Session
对象及其User
,则无需在Session
类型中包含userId
字段。
您可以通过两种方式解决这种情况。第一个是对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
对象,并且在 Session
类型的任何字段上没有额外的 resolve
方法。第二种解决方案是我之前展示过的解决方案,您在 Session
类型的字段 user
上使用 resolve
方法 - 所以您只需告诉 GraphQL 它应该如何获取该字段的值。
【讨论】:
好吧,我的错,我认为不用说每个查询都有解析器。如果我没有解析器,程序甚至会在此错误消息之前崩溃。但为了完整和明确起见,我会将我的解析器添加到上面的代码中。如果我只是在没有用户的情况下查询会话,则该查询有效。另一件事:我使用 Apollo 的 graphql-tools 进行模式定义,所以它的定义是基于 GraphQL 类型语言的。查看 2017 年 2 月 23 日的附录 我编辑了答案,为您的案例提供了一个示例以上是关于graphql 抛出未知参数错误的主要内容,如果未能解决你的问题,请参考以下文章
GraphQL 错误:字段“removeFromPostsOnComments”上的未知参数“已删除”
为啥graphQl在尝试对查询进行切片时返回“字段上的未知参数'first'......”错误?
Angular Apollo:错误:GraphQL 错误:“Mutation”类型的字段“AuthLogin”上的未知参数“用户名”
出现错误:“Query”类型的“user”字段上的未知参数“id”[GraphQL,Relay,React]
[GraphQL 错误]:消息:“rootMutation”类型的字段“createUser”上的未知参数“email”。位置:[object Object],路径:未定义