如何为 GraphQL 使用数组模式类型

Posted

技术标签:

【中文标题】如何为 GraphQL 使用数组模式类型【英文标题】:How to use arrays Schema Types for GraphQL 【发布时间】:2019-07-07 18:09:38 【问题描述】:

第一次尝试 GraphQL,我希望一个模式类型能够访问另一个模式类型中的对象数组。在将其连接到 MongoDB 之前,我正在使用本地数据和 lodash 对其进行测试。关于我的尝试,我遇到了一些错误。我知道我很接近了。任何援助将不胜感激。

以下是我最近的尝试。我使用 express-graphql 访问了 GraphQLList,并使用 GraphQLID 访问了第二个模式。

schema.js

var projects = [

    name: "Title 1",
    subtitle: "Subtitle 1",
    summary: "Lorem ipsum....",
    languageId: ["4", "2"],
    id: "1"
,
...

var languages = [
 name: "javascript", id: "1" ,
 name: "html", id: "2" ,
 name: "CSS", id: "3" ,
 name: "Python", id: "4" ,
]
...

const ProjectType = new GraphQLObjectType(
name: 'Project',
fields: () => (
    id:  type: GraphQLID ,
    name:  type: GraphQLString ,
    subtitle:  type: GraphQLString ,
    summary:  type: GraphQLString ,
    languages: 
        type: new GraphQLList(GraphQLID),
        resolve(parent, args) 
            console.log(parent)
            return _.find(languages,  id: parent.languageId )
        
    
)
);

const LanguageType = new GraphQLObjectType(
name: 'Language',
fields: () => (
    id:  type: GraphQLID ,
    name:  type: GraphQLString ,
     )
);

//Root Queries
const RootQuery = new GraphQLObjectType(
name: 'RootQueryType',
fields: 
    project: 
        type: ProjectType,
        args:  id:  type: GraphQLID  ,
        resolve(parent, args) 

           return _.find(projects,  id: args.id );
        
    ,
    language: 
        type: LanguageType,
        args:  id:  type: GraphQLID  ,
        resolve(parent, args) 

            return _.find(languages,  id: args.id )
          
        
    
);

目的是在 Graphiql 中显示该项目中使用的语言列表,看起来像这样......

    
    "data": 
    "project": 
      "name": "Project 1"
      languages
          names
             "Python"
             "HTML" 
              
            
         
        
       

相反,我得到以下...

    
  "errors": [
    
      "message": "Syntax Error: Expected Name, found ",
      "locations": [
        
          "line": 7,
          "column": 7
        
      ]
    
  ]

我重新格式化了对一系列语言进行硬编码的决心,这可行,但它不起作用。任何建议将不胜感激。谢谢大家的时间。

【问题讨论】:

【参考方案1】:

我的标签的旧项目有问题。最后,我通过 try and catch 找到了你可以使用它 技术标签: type: GraphQLList(GraphQLString),

【讨论】:

【参考方案2】:

我不确定您要进行什么查询。 但是为了返回嵌套在Projects中的Languages,你应该改变languages字段的返回类型。

类似:

const ProjectType = new GraphQLObjectType(
    name: 'Project',
    fields: () => (
        id: type: GraphQLID,
        name: type: GraphQLString,
        subtitle: type: GraphQLString,
        summary: type: GraphQLString,
        languages: 

            // change this type to LanguageType
            type: new GraphQLList(LanguageType),
            resolve(parent, args) 
                // No need to lodash here
                return languages.filter((language) => 
                    return  parent.languageId.includes(language.id)
                )
            
        
    )
);

【讨论】:

这确实让我更接近了。我现在在 GraphiQL "data": "project": "name": "Title 1", "summary": "Summary 1", "languages": [] 中收到以下响应尽管该数组仍然是空的。我尝试重新格式化虚拟数据,以便语言类别是一个对象数组。仍然是空的,但控制台日志返回的一切都很好。 我目前正在尝试反转模式中的一对多关系,因此我不会将一种项目与多种语言相关联,而是将一种语言与多种项目联系起来。但是,我觉得这是错误的做法,因为它会对前端产生不利影响。 嘿@AaronToliver,我更新了我的答案。获取语​​言时出现问题。那里不需要使用 lodash,一个简单的过滤器就可以了。 谢谢@MarcoDaniels。它现在完美地记录控制台。我想我在 GraphiQL 中使用了错误的查询,但我会查看文档。非常感谢!

以上是关于如何为 GraphQL 使用数组模式类型的主要内容,如果未能解决你的问题,请参考以下文章

如何为自引用数据层次结构创建 graphql 模式?

如何为 graphql-java-servlet 和 Micronaut 控制器配置 GraphQL servlet 端点?

如何为 MySQL 模型制作 GraphQL 模式?

如何为 TypeScript 配置 `*.graphql` 导入?

使用 Prisma,我们如何为类型添加评论?

如何为 GraphQLObjectType 的 GraphQLList 定义 Relay 片段?