gpt4 book ai didi

graphql - 如何结合 gatsby 片段创建 gatsby 模式

转载 作者:行者123 更新时间:2023-12-01 23:46:29 26 4
gpt4 key购买 nike

我正在尝试为 gatsby graphql 查询定义正确的模式,以便它可以返回 null(使内容可选)。据我了解,我需要在 gatsby-node.js 文件中预定义模式,这样 gatsby 就不必通过数据推断类型。但是我不确定模式定义需要是什么,因为我们正在使用 gatsby 片段来查询数据。这是(部分)查询:

... on ContentfulWorkPage {
comingSoon {
id
title
image {
fluid(quality: 92, maxWidth: 1280) {
...GatsbyContentfulFluid_withWebp_noBase64
}
}
comingSoonText
}
}

问题是我不确定如何定义 GatsbyContentfulFluid_withWebp_noBase64

我正在尝试:

const types = `
type ContentfulWorkPage implements Node {
comingSoon: ComingSoon
}

type ComingSoon {
id: String
title: String
comingSoonText: String
image: Image
}

type Image {
fluid: Fluid
}

type Fluid {
quality: Int
maxWidth: Int
title: String
}
`
createTypes(types)

即使我认为我走在正确的轨道上,我仍然遇到以下错误:

There was an error in your GraphQL query:

Unknown argument "quality" on field "fluid" of type "Image".

GraphQL request:70:21
69 | image {
70 | fluid(quality: 92, maxWidth: 1280) {
| ^
71 | ...GatsbyContentfulFluid_withWebp_noBase64

File: src/templates/mainPages/work.js:105:21


ERROR #85901 GRAPHQL

There was an error in your GraphQL query:

Unknown argument "maxWidth" on field "fluid" of type "Image".

GraphQL request:70:34
69 | image {
70 | fluid(quality: 92, maxWidth: 1280) {
| ^
71 | ...GatsbyContentfulFluid_withWebp_noBase64

File: src/templates/mainPages/work.js:105:34


ERROR #85901 GRAPHQL

There was an error in your GraphQL query:

Fragment "GatsbyContentfulFluid_withWebp_noBase64" cannot be spread here as objects of type "Fluid" can never be of type "ContentfulFluid".

GraphQL request:71:17
70 | fluid(quality: 92, maxWidth: 1280) {
71 | ...GatsbyContentfulFluid_withWebp_noBase64
| ^
72 | }

最佳答案

因此,在深入研究 gatsby 文档 (https://www.gatsbyjs.com/docs/actions/#printTypeDefinitions) 后,我设法解决了这个问题。我发现在 gatsby-node.js 文件中,您可以使用 printTypeDefinitions 函数来打印您的数据类型,然后您可以使用它来预定义可选属性:

exports.createSchemaCustomization= ({ actions }) => {
actions.printTypeDefinitions({path: './typeDefs.txt'})
}

这将在您的根文件夹中创建一个 typeDefs.txt 文件,其中描述了所有推断类型。因此,如果您像我一样正在寻找更复杂的类型定义,以便它们可以在内容丰富的情况下成为可选的,您可以:

  • 将一些数据添加到内容丰富的可选字段(或您正在使用的任何后端/服务器)
  • 使用该函数从数据中获取类型定义
  • 从 typeDefs 文件中复制您需要的任何部分
  • createSchemaCustomization 的 createTypes 函数中使用它

示例(comingSoon 定义是从 typeDevs 文件中复制的):

exports.createSchemaCustomization = ({ actions }) => {
const contentfulSomePage = `
type ContentfulSomePage implements Node {
comingSoon: [ContentfulCaseComingSoon] @link(by: "id", from: "comingSoon___NODE")
}

type ContentfulCaseComingSoon implements Node @derivedTypes @dontInfer {
title: String
comingSoonText: String
image: ContentfulAsset @link(by: "id", from: "image___NODE")
}
`
actions.createTypes(contentfulWorkPage)
}

额外提示:如果您只需要指定一个属性是可选的,而其余的则可以推断。删除 @dontInfer 注释,只复制可为 null 的属性,而不是从文件中复制整个类型。

关于graphql - 如何结合 gatsby 片段创建 gatsby 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64065878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com