我想将现有资源统一为一个资源。考虑将所有Ghost帖子和Markdown文件转换为具有统一字段的单个节点。
我目前的方法是使用onCreateNode
API,并为每个适当的节点(例如Ghost或Markdown)创建一个新节点。
我当前面临的问题是Markdown节点目前没有提供正确的html
字段。根据实现,这些字段会添加到setFieldsOnGraphQLNodeType
API中。
所以我的问题是:
onCreateNode
甚至是将节点组合成单个节点的合适位置吗?
如果是,那么此时不存在的字段呢?
如果否:还有什么地方?
谢谢。
答案 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