GraphQL 期望 Iterable,但没有为字段 xxx.yyy 找到一个
Posted
技术标签:
【中文标题】GraphQL 期望 Iterable,但没有为字段 xxx.yyy 找到一个【英文标题】:GraphQL Expected Iterable, but did not find one for field xxx.yyy 【发布时间】:2021-01-20 02:54:14 【问题描述】:我目前正在使用 NodeJS 尝试 GraphQL,但我不知道为什么以下查询会出现此错误:
library
name,
user
name
email
我不确定我的resolveLibrary
的type
是否正确,因为在任何示例中我都看到他们使用了new GraphQL.GraphQLList()
,但在我的情况下,我真的想返回单个用户对象,而不是一组用户。
我的代码:
const GraphQL = require('graphql');
const DB = require('../database/db');
const user = require('./user').type;
const library = new GraphQL.GraphQLObjectType(
name: 'library',
description: `This represents a user's library`,
fields: () =>
return
name:
type: GraphQL.GraphQLString,
resolve(library)
return library.name;
,
user:
type: user,
resolve(library)
console.log(library.user);
return library.user
);
const resolveLibrary =
type: library,
resolve(root)
return
name: 'My fancy library',
user:
name: 'User name',
email:
email: 'test@123.de'
module.exports = resolveLibrary;
错误:
Error: Expected Iterable, but did not find one for field library.user.
所以我的library
架构提供了一个user
字段,它返回正确的数据(调用了console.log)。
【问题讨论】:
这听起来可能是您正在导入的用户类型的问题。您能否更新您的问题以包含user.js
的代码?
非常感谢,你说的对,我的user.js导出错了……
请在编辑中显示您的解决方案?
【参考方案1】:
对我来说,这是一个简单的修复。
items:
type: new GraphQLList(VideoType),<-- error
resolve(parentValue, args)
const url = 'www'
return axios.get(url)
.then(res => res.data);
并将其更改为
items:
type: VideoType,
resolve(parentValue, args)
const url = 'www'
return axios.get(url)
.then(res => res.data);
【讨论】:
【参考方案2】:我遇到了同样的问题,但我在 Go 中使用 GraphQL。
解决方案: 我提到返回类型是一个列表(或者你可以说是一个数组),但我的解析器函数返回的是一个接口而不是接口列表。
之前 =>
Type: graphql.NewList(graphqll.UniversalType)
后来我改成了=>
Type: graphqll.UniversalType
graphqll.UniversalType : 'graphqll' 是我的用户定义包的名称,'UniversalType' 是我创建的 GraphQL 对象。
之前graphql对象的结构是:
var GetAllEmpDet = &graphql.Field
Type: graphql.NewList(graphqll.UniversalType),
Resolve: func(params graphql.ResolveParams) (interface, error)
...
...
// Your resolver code goes here, how you handle.
...
return models.Universal, nil // models.Universal is struct and not list of struct so it gave that error.
,
当我把它改为:
var GetAllEmpDet = &graphql.Field
Type: graphqll.UniversalType,
Resolve: func(params graphql.ResolveParams) (interface, error)
...
...
// Your resolver code goes here, how you handle.
...
return models.Universal, nil // models.Universal is struct and not list of struct so it gave that error.
,
【讨论】:
【参考方案3】:我也遇到了这个问题。您从解析器返回的内容似乎与架构中的返回类型不匹配。
特别是对于错误消息 Expected Iterable, but did not find one for field library.user.
,您的架构需要一个数组(可迭代),但您没有在解析器中返回一个数组
我的 schema.js 中有这个:
login(email: String, password: String): [SuccessfulLogin]
我把它改成了:
login(email: String, password: String): SuccessfulLogin
注意“SuccessfulLogin”周围的方括号。是否要更新解析器返回类型或更新架构的期望由您决定
【讨论】:
嗨@vineeth,感谢您的更新,我还有一件事要问,方括号是干什么用的?没有他们似乎很好 @Liang 方括号表示您应该期待 JSON 响应中的可迭代对象或数组。为迟到的回应道歉 谢谢,不用担心。我想我现在明白了,[]
意味着它应该返回array
,没有,应该返回object
该死,我换了一些东西,忘了把它改回来 lmao。谢谢。
读到这里我感到内疚。感谢您花时间发布此答案。【参考方案4】:
在我的情况下,它与 django-graphene
有关,我没有定义解析方法。
class SomeNode(DjangoObjectType):
things = graphene.List(ThingNode)
def resolve_things(self, info, **kwargs):
return self.things.all()
【讨论】:
【参考方案5】:我遇到了同样的问题。我使用的是 find 过滤器。
【讨论】:
【参考方案6】:我猜你的user
是GraphQLList
的一个实例,这就是字段用户期望解析为可迭代对象的原因。
【讨论】:
以上是关于GraphQL 期望 Iterable,但没有为字段 xxx.yyy 找到一个的主要内容,如果未能解决你的问题,请参考以下文章
PubSub 在客户端页面中不起作用,但在 Graphql 游乐场中起作用 - TypeError: data.getPosts is not iterable
GraphQL 错误:Int 类型的变量 junctionId!用于期望 bigint 的位置