Gatsby 由于onCreateNode中缺少字段,无法统一源

Gatsby 由于onCreateNode中缺少字段,无法统一源,gatsby,Gatsby,我想将现有的源代码统一到一个源代码中。考虑将所有的Ghost POST和标记文件转换为具有统一字段的单个节点 我目前的方法是连接到onCreateNodeAPI,并为每个适当的节点(例如Ghost或Markdown)创建一个新节点 我目前面临的问题是,标记节点此时没有提供正确的html字段。根据实现,这些字段添加到setFieldsOnGraphQLNodeTypeAPI中 所以我的问题是: onCreateNode是否是将节点合并为单个节点的合适位置? 如果是:那么此时不存在的字段呢 如果没有

我想将现有的源代码统一到一个源代码中。考虑将所有的Ghost POST和标记文件转换为具有统一字段的单个节点

我目前的方法是连接到
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