Gatsby 由于onCreateNode中缺少字段,无法统一源
我想将现有的源代码统一到一个源代码中。考虑将所有的Ghost POST和标记文件转换为具有统一字段的单个节点 我目前的方法是连接到Gatsby 由于onCreateNode中缺少字段,无法统一源,gatsby,Gatsby,我想将现有的源代码统一到一个源代码中。考虑将所有的Ghost POST和标记文件转换为具有统一字段的单个节点 我目前的方法是连接到onCreateNodeAPI,并为每个适当的节点(例如Ghost或Markdown)创建一个新节点 我目前面临的问题是,标记节点此时没有提供正确的html字段。根据实现,这些字段添加到setFieldsOnGraphQLNodeTypeAPI中 所以我的问题是: onCreateNode是否是将节点合并为单个节点的合适位置? 如果是:那么此时不存在的字段呢 如果没有
onCreateNode
API,并为每个适当的节点(例如Ghost或Markdown)创建一个新节点
我目前面临的问题是,标记节点此时没有提供正确的html
字段。根据实现,这些字段添加到setFieldsOnGraphQLNodeType
API中
所以我的问题是:
onCreateNode
是否是将节点合并为单个节点的合适位置?
如果是:那么此时不存在的字段呢
如果没有:还有哪里
谢谢
onCreateNode是否是将节点合并为单个节点的合适位置
这取决于在合并过程中要访问的字段类型。正如您所注意到的,如果该字段是使用setFieldsOnGraphQLNodeType
定义的,并且具有提供其值的resolve
函数,则该值应该只能从graphql查询中访问,该值是根据需要提供的,在调用onCreateNode
时不存在
您可以使用setFieldsOnGraphQLNodeType
创建自己的字段,API提供了足够的信息来从解析程序中查找类型定义、查找字段定义和链调用其解析程序。不确定是否官方支持使用API或恰好有效的黑客:
exports.setFieldsOnGraphQLNodeType = (
{
type,
getNode
},
pluginOptions
) => {
if (type.name !== 'YourNodeType') {
return {}
}
return {
yourCombindedField: {
type: 'String',
resolve(node, args, context, info) {
const parentNode = getNode(node.parent)
const parentType = info.schema.getType(parentNode.internal.type)
if (parentType.name === 'MarkdownRemark') {
const htmlField = parentType.getFields()['html']
return Promise.resolve(
const htmlInfo = {...info, fieldName: 'html', returnType: htmlField.type}
// call markdown html field resolve()
htmlField.resolve(parentNode, {}, context, htmlInfo)
).then(html => {
return html // return combined field here
})
}
}
}
}
}
这是到盖茨比的链接,盖茨比调用字段解析器,以及
onCreateNode是否是将节点合并为单个节点的合适位置
这取决于在合并过程中要访问的字段类型。正如您所注意到的,如果该字段是使用setFieldsOnGraphQLNodeType
定义的,并且具有提供其值的resolve
函数,则该值应该只能从graphql查询中访问,该值是根据需要提供的,在调用onCreateNode
时不存在
您可以使用setFieldsOnGraphQLNodeType
创建自己的字段,API提供了足够的信息来从解析程序中查找类型定义、查找字段定义和链调用其解析程序。不确定是否官方支持使用API或恰好有效的黑客:
exports.setFieldsOnGraphQLNodeType = (
{
type,
getNode
},
pluginOptions
) => {
if (type.name !== 'YourNodeType') {
return {}
}
return {
yourCombindedField: {
type: 'String',
resolve(node, args, context, info) {
const parentNode = getNode(node.parent)
const parentType = info.schema.getType(parentNode.internal.type)
if (parentType.name === 'MarkdownRemark') {
const htmlField = parentType.getFields()['html']
return Promise.resolve(
const htmlInfo = {...info, fieldName: 'html', returnType: htmlField.type}
// call markdown html field resolve()
htmlField.resolve(parentNode, {}, context, htmlInfo)
).then(html => {
return html // return combined field here
})
}
}
}
}
}
这是到gatsby的链接,它调用字段解析程序,并且hhhm,这并不简单,但我想您可以使用
createResolvers
&手动将节点类型映射到markdownRemark?您根本不需要使用onCreateNode
,这并不简单,但我想您可以使用createResolvers
&手动将节点类型映射到markdownRemark字段?您根本不需要使用onCreateNode