模式中不存在的 Gatsby `S3Object`。在添加解析器之前使用`createTypes`添加类型
Posted
技术标签:
【中文标题】模式中不存在的 Gatsby `S3Object`。在添加解析器之前使用`createTypes`添加类型【英文标题】:Gatsby `S3Object` that doesn't exist in the schema. Use `createTypes` to add the type before adding resolvers 【发布时间】:2020-11-01 11:06:09 【问题描述】:我正在尝试使用以下代码从我在 Gatsby 的 S3 存储桶中提取远程图像。我有一个构建经典 S3Object 的 schema.graphql。但是 Gatsby Node 抛出以下错误。在这个问题上,我已经在文档中待了好几天了,有人能指出我正确的方向吗?我只需要将图像放入 Gatsby 的数据层,这样我就可以使用 Gatsby-image。
我感觉我需要更新 S3Object 以扩展节点接口,我现在正在处理这个问题。
错误:
warn `createResolvers` passed resolvers for type `S3Object` that doesn't exist in the schema. Use `createTypes` to add the type before adding resolvers.
schema.graphql
type PortfolioItem @model @key(fields: ["title", "createdAt"])
id: ID!
title: String!
file: S3Object
thumbnailUrl: String
...
type S3Object
bucket: String!
key: String!
region: String!
gatsby-node.js
exports.createResolvers = ( actions, cache, createNodeId, createResolvers, store, reporter ) =>
const createNode = actions;
createResolvers(
S3Object:
imageFile:
type: `File`,
resolve(source, args, context, info)
return createRemoteFileNode(
url: 'https://my-aws-bucket-url.s3.us-east-2.amazonaws.com/' + source.key,
store,
cache,
createNode,
createNodeId,
reporter,
);
,
,
,
);
;
【问题讨论】:
你是如何创建S3Object
类型的?
这篇博文可能有用gatsbyjs.org/blog/2019-03-18-releasing-new-schema-customization
谷歌搜索“gatsby s3 source”没有返回好的结果/示例?
【参考方案1】:
好吧,伙计们,
经过数周的调查。这就是答案,我知道这将帮助许多处理 Gatsby 和远程图像的人。
这里的全部目标是直接访问 graphql 中模型上的字段上的远程图像。没有循环来自一些 Gatsby listAllImages 查询的长图像数组和类似的废话。这会将实际的 USEABLE GATSBY-IMAGE 直接添加到模型的字段上,以便立即使用。
-
在您的 Schema.Graphql 中定义一个 S3Object,如下所示。
type S3Object
bucket: String!
key: String!
region: String!
-
这里的答案是在您的 gatsby 节点文件中创建一个自定义解析器。这里的诀窍是进入 gatsby 级别的模式并查看模型的真实名称。这就是秘密。您需要运行:
gatsby repl
这会让你进入 Gatsby 的 CLI,然后输入:
schema
这将显示已编译的架构级别名称。因此,您的 S3Object 实际上称为
对于像我这样的菜鸟来说,这是一个超级复杂的解决方案,我希望这可以解决像我这样的其他人的远程文件问题!
exports.createResolvers = ( createResolvers ) =>
const resolvers =
ryanthedev_S3Object:
imageFile:
type: 'File', // this needs to be 'File', since it's not returning an 'ImageSharp' node anymore
resolve: (source, args, context, info) =>
// A promise is expected to be returned anyway so don't need
// to `await` the result here, if all we're doing is returning
// the `File` node
return context.nodeModel.runQuery(
query:
filter:
base: eq: source.key ,
,
,
type: 'File',
firstOnly: true,
);
,
,
,
;
createResolvers(resolvers);
;
【讨论】:
以上是关于模式中不存在的 Gatsby `S3Object`。在添加解析器之前使用`createTypes`添加类型的主要内容,如果未能解决你的问题,请参考以下文章
变量“$productSlug”从未在“SingleProduct”操作中使用。图形错误。变量在我的 Gatsby graphql 查询中不起作用
来自 Gatsby 中单个对象 JSON 文件的 GraphQL 模式