如何在 gatsby Contentful Rich Text 中有选择地查询引用?
How to optionally query references in gatsby Contentful Rich Text?
我正在尝试创建一个博客页面,可以选择显示任何存在的图像资源。
首先,我在 Contentful 中创建了一个内容模式,其中包含一个名为“Body”的富文本,然后我创建了一个包含一些随机文本的条目。在 Gatsby 中,当我尝试通过 GraphQL 资源管理器查询数据时,我可以查询“正文”内的“原始”字段。除非我添加至少一个图像资产(又名“虚拟内容”),否则无法查询“参考”字段。
下面是我的 graphql 查询
export const query = graphql`
query ($slug: String!) {
contentfulBlog(slug: { eq: $slug }, node_locale: { eq: "en-US" }) {
title
body {
raw
references {
... on ContentfulAsset {
contentful_id
__typename
gatsbyImageData(formats: AUTO, layout: FULL_WIDTH)
}
}
}
}
}
`
上述查询的问题在于,如果在 post 中未找到图像资源,则会中断查询。我的目标是能够在有可用资产时有选择地查询引用字段。但是我不知道该怎么做。
** 2021 年 8 月 24 日更新:
致今天还在为这个问题苦苦挣扎的任何人:
在浏览了大量文档和答案后,我发现这实际上是 gatsby-source-contentful 插件的局限性之一。简而言之,插件 (v4),正如它在 documentation:
中所述
At the moment, fields that do not have at least one populated instance
will not be created in the GraphQL schema.
不确定这是否会在未来的版本中解决,但目前,需要在您的富文本正文中添加至少一个虚拟内容(嵌入图像、链接等),以便在 graphql 模式中创建“引用”字段的插件。
这里是官方discussion thread
如果想法是仅查询 references
如果它们可用,则需要 customize the GraphQL schema 使字段可为空(这意味着它可以为空,null
)因为,通过默认情况下,推断不是。
您可以在以下位置检查 Contentful 内容类型:https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/content-types/content-model
这将是理想的解决方案。或者,根据此 Medium article,您可以通过将违规节点包装在 Node 类型对象中来绕过它。你的情况:
export const query = graphql`
query ($slug: String!) {
contentfulBlog(slug: { eq: $slug }, node_locale: { eq: "en-US" }) {
title
body {
raw
references {
... on Node {
... on ContentfulAsset {
contentful_id
__typename
gatsbyImageData(formats: AUTO, layout: FULL_WIDTH)
}
}
}
}
}
}
`
您可能需要对其进行调整。在不知道您的数据和模式结构的情况下,不可能猜测上面的查询是否会单独工作,但请理解。在 GrahiQL playground (localhost:8000/___graphql
)
中查看
其他资源:
我正在尝试创建一个博客页面,可以选择显示任何存在的图像资源。
首先,我在 Contentful 中创建了一个内容模式,其中包含一个名为“Body”的富文本,然后我创建了一个包含一些随机文本的条目。在 Gatsby 中,当我尝试通过 GraphQL 资源管理器查询数据时,我可以查询“正文”内的“原始”字段。除非我添加至少一个图像资产(又名“虚拟内容”),否则无法查询“参考”字段。
下面是我的 graphql 查询
export const query = graphql`
query ($slug: String!) {
contentfulBlog(slug: { eq: $slug }, node_locale: { eq: "en-US" }) {
title
body {
raw
references {
... on ContentfulAsset {
contentful_id
__typename
gatsbyImageData(formats: AUTO, layout: FULL_WIDTH)
}
}
}
}
}
`
上述查询的问题在于,如果在 post 中未找到图像资源,则会中断查询。我的目标是能够在有可用资产时有选择地查询引用字段。但是我不知道该怎么做。
** 2021 年 8 月 24 日更新:
致今天还在为这个问题苦苦挣扎的任何人: 在浏览了大量文档和答案后,我发现这实际上是 gatsby-source-contentful 插件的局限性之一。简而言之,插件 (v4),正如它在 documentation:
中所述At the moment, fields that do not have at least one populated instance will not be created in the GraphQL schema.
不确定这是否会在未来的版本中解决,但目前,需要在您的富文本正文中添加至少一个虚拟内容(嵌入图像、链接等),以便在 graphql 模式中创建“引用”字段的插件。
这里是官方discussion thread
如果想法是仅查询 references
如果它们可用,则需要 customize the GraphQL schema 使字段可为空(这意味着它可以为空,null
)因为,通过默认情况下,推断不是。
您可以在以下位置检查 Contentful 内容类型:https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/content-types/content-model
这将是理想的解决方案。或者,根据此 Medium article,您可以通过将违规节点包装在 Node 类型对象中来绕过它。你的情况:
export const query = graphql`
query ($slug: String!) {
contentfulBlog(slug: { eq: $slug }, node_locale: { eq: "en-US" }) {
title
body {
raw
references {
... on Node {
... on ContentfulAsset {
contentful_id
__typename
gatsbyImageData(formats: AUTO, layout: FULL_WIDTH)
}
}
}
}
}
}
`
您可能需要对其进行调整。在不知道您的数据和模式结构的情况下,不可能猜测上面的查询是否会单独工作,但请理解。在 GrahiQL playground (localhost:8000/___graphql
)
其他资源: