GraphQL 期望 Iterable,但没有为字段 xxx.yyy 找到一个

Posted

技术标签:

【中文标题】GraphQL 期望 Iterable,但没有为字段 xxx.yyy 找到一个【英文标题】:GraphQL Expected Iterable, but did not find one for field xxx.yyy 【发布时间】:2020-04-20 16:45:04 【问题描述】:

我目前正在使用 NodeJS 尝试 GraphQL,但我不知道为什么以下查询会出现此错误:


  library
    name,
    user 
      name
      email
    
  

我不确定我的resolveLibrarytype 是否正确,因为在任何示例中我都看到他们使用了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】:

我也遇到了这个问题。您从解析器返回的内容似乎与架构中的返回类型不匹配。

特别是对于错误消息 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。谢谢。 读到这里我感到内疚。感谢您花时间发布此答案。【参考方案2】:

我猜你的userGraphQLList 的一个实例,这就是字段用户期望解析为可迭代对象的原因。

【讨论】:

【参考方案3】:

我遇到了同样的问题。我使用的是 find 过滤器。

【讨论】:

【参考方案4】:

我遇到了同样的问题,但我在 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.
    ,

【讨论】:

【参考方案5】:

在我的情况下,它与 django-graphene 有关,我没有定义解析方法。

class SomeNode(DjangoObjectType):
    things = graphene.List(ThingNode)

    def resolve_things(self, info, **kwargs):
        return self.things.all()

【讨论】:

【参考方案6】:

对我来说,这是一个简单的修复。

 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);
        
    

【讨论】:

以上是关于GraphQL 期望 Iterable,但没有为字段 xxx.yyy 找到一个的主要内容,如果未能解决你的问题,请参考以下文章

试图附加到 Iterable[String]

PubSub 在客户端页面中不起作用,但在 Graphql 游乐场中起作用 - TypeError: data.getPosts is not iterable

不变违规:期望解析的 GraphQL 文档

GraphQL 错误:Int 类型的变量 junctionId!用于期望 bigint 的位置

为什么数组没有实现Iterable接口,但可以使用foreach语句遍历

将 PDF 下载为字节流