如何为 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-java-servlet 和 Micronaut 控制器配置 GraphQL servlet 端点?