Javascript 盖茨比:为什么我(甚至是我?)需要使用exports.onCreateNode来创建页面?

Javascript 盖茨比:为什么我(甚至是我?)需要使用exports.onCreateNode来创建页面?,javascript,gatsby,Javascript,Gatsby,盖茨比文档中的所有示例似乎都假设您要定义一个exports.onCreateNode,首先解析数据,然后定义一个单独的exports.createPages来执行路由 然而,这似乎不必要地复杂。一个更简单的选项似乎是只使用createPages提供的graphql选项: exports.createPages = async ({ graphql, actions }) => { const { createPage } = actions; const { data } = aw

盖茨比文档中的所有示例似乎都假设您要定义一个
exports.onCreateNode
,首先解析数据,然后定义一个单独的
exports.createPages
来执行路由

然而,这似乎不必要地复杂。一个更简单的选项似乎是只使用
createPages
提供的
graphql
选项:

exports.createPages = async ({ graphql, actions }) => {
  const { createPage } = actions;
  const { data } = await graphql(query);
  // use data to build page
  data.someArray.forEach(datum => 
    createPage({ path: `/some/path/${datum.foo}`, component: SomeComponent }));
但是,当我这样做时,我会得到一个错误:

TypeError:filepath.includes不是函数

我假设这是因为
createPage
path
prop是一个字符串,应该是“slug”。然而,所有生成slug的方法似乎都涉及到整个
exports.onCreateNode
过程


我是否缺少从路径字符串生成有效段塞的简单解决方案?或者我误解了盖茨比,出于某种原因,每次我使用
createPage
,我都需要使用
onCreateNode

结果是我提到的错误:

TypeError:filepath.includes不是函数

根本不是来自
路径
道具:它来自(非常有名的)
组件
道具。。。它不接受组件函数/类!相反,它需要一个组件的路径(为什么他们不调用prop
componentPath
,我真不明白!)

但除此之外,一旦我将“组件”修复为(叹气)不再是组件,我就能够克服这个错误并创建页面。。。结果证明,整个
onCreateNode
的事情是不必要的

为什么我需要使用exports.onCreateNode来创建页面

你没有

盖茨比在幕后大量使用GraphQL。盖茨比文档告诉用户,盖茨比中的许多特性通常只能通过GraphQL获得


您可以在不使用GraphQL的情况下创建页面,正如您在使用
data.someArray.forEach…
进行应答时所做的那样,但这不是预期的方式。通过跳过
createNodeField
,您将无法在页面查询中查询这些字段。如果您不需要通过GraphQL使用这些字段,那么您的解决方案是完美的。

您有任何您所指的盖茨比文档的示例吗?谢谢,但我仍然能够以这种方式使用GraphQL数据:我只是将
数据作为上下文变量传递到页面。我仍然真的不明白onCreateNode的意义,它的额外复杂性(似乎)没有额外的好处。