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

时间:2019-08-10 15:00:39

标签: gatsby

我想将现有资源统一为一个资源。考虑将所有Ghost帖子和Markdown文件转换为具有统一字段的单个节点。

我目前的方法是使用onCreateNode API,并为每个适当的节点(例如Ghost或Markdown)创建一个新节点。

我当前面临的问题是Markdown节点目前没有提供正确的html字段。根据实现,这些字段会添加到setFieldsOnGraphQLNodeType API中。

所以我的问题是:

onCreateNode甚至是将节点组合成单个节点的合适位置吗? 如果是,那么此时不存在的字段呢?

如果否:还有什么地方?

谢谢。

1 个答案:

答案 0 :(得分:0)

  

onCreateNode甚至是将节点组合成单个节点的合适位置吗?

这取决于您在合并过程中要访问的字段的类型。您已经注意到,如果使用setFieldsOnGraphQLNodeType定义字段并且具有提供其值的resolve函数,则该值应该只能通过graphql查询访问,该值是按需提供的,而不能按需提供onCreateNode被调用时出现。

可以使用setFieldsOnGraphQLNodeType创建自己的字段,API提供了足够的信息来查找类型定义,字段定义以及从解析器中链式调用其解析器。不确定它是否受官方支持使用API​​或恰好起作用的hack:

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 source code的链接,该链接调用字段解析器,而outdated documentation