【问题标题】:Gatsby graphql query works fine in development environment, but not onPostBuildGatsby graphql 查询在开发环境中工作正常,但在PostBuild 上不行
【发布时间】:2021-03-10 22:31:52
【问题描述】:

更新到 Gatbsy v3 和 gatsby-plugin-sitemap v3 后出现问题在我的 gatsby-config.js 中,我有站点地图的配置:

{
  resolve: 'gatsby-plugin-sitemap',
  options: getSitemapForLanguage('en'),
},
{
  resolve: 'gatsby-plugin-sitemap',
  options: getSitemapForLanguage('de'),
},

我得到了以下函数,它根据传递的语言生成站点地图:

const getSitemapForLanguage = lang => ({
  output: `/${lang === 'en' ? '' : lang}/sitemap.xml`,
  query: `
  {
    site {
        siteMetadata {
          siteUrl
        }
      }
    allMdx(
      filter: {frontmatter: {seo: {exclude_from_sitemap: {ne: true}}, languages: {in: "${lang}"}}}
    ) {
      edges {
        node {
          frontmatter {
            pathname
          }
        }
      }
    }
  }`,

  serialize: ({ site, allMdx }) =>
    allMdx.edges.map(edge => ({
      url: `${site.siteMetadata.siteUrl}${lang === 'en' ? '' : `/${lang}`}${
        edge.node.frontmatter.pathname
      }`,
      changefreq: 'daily',
      priority: 0.7,
    })),
});

我使用用于 graphql 的浏览器内 IDE 创建了这个,当你运行 gatsby develop 时你会得到它。在那个 IDE 中,我可以看到结果和我需要的一切,但是当我尝试构建它时,我得到:

TypeError: Cannot use 'in' operator to search for 'nodes' in undefined Error of failed build process

出于测试目的,我删除了查询中的, languages: {in: "${lang}"} 部分,但它仍然不起作用。

【问题讨论】:

    标签: graphql gatsby


    【解决方案1】:

    我认为它甚至不能在gatsby develop 中工作,因为该插件只能在生产模式下工作。正如您在gatsby-plugin-sitemap docs 中看到的:

    注意:此插件仅在production 模式下运行时才会生成输出! 要测试您的站点地图,请运行:gatsby build && gatsby serve

    gatsby develop 甚至没有触发插件,甚至查询可能在localhost:8000/___graphql 操场上工作。

    在我看来,问题取决于语言参数,您不能像 gatsby-config.js 那样在 Node 文件中传递这样的 GraphQL 变量。方法是创建单独的查询并以某种方式将它们序列化。您的配置应如下所示:

      {
        resolve: `gatsby-plugin-sitemap`,
        options: {
          query: `
            {
              site {
                siteMetadata {
                  siteUrl
                }
              }
     
             deSitemap: allMdx(
              filter: {frontmatter: {seo: {exclude_from_sitemap: {ne: true}}, languages: {in: "de"}}}
            ) {
              edges {
                node {
                  frontmatter {
                   pathname
                  }
                }
              }
            }
             enSitemap: allMdx(
              filter: {frontmatter: {seo: {exclude_from_sitemap: {ne: true}}, languages: {in: "en"}}}
            ) {
              edges {
                node {
                  frontmatter {
                   pathname
                  }
                }
              }
            }
          }`,
          serialize: ({ site, allSitePage }) => enSitemap.edges // here you will need to serialize both or append the language at the end
            .map(edge => {
              return {
                url: site.siteMetadata.siteUrl + path, // https://sitemaps.com/page-path
                changefreq: 'daily',
                priority: 0.7,
                links: [
                  // https://sitemaps.com/page-path
                  { lang: 'en', url: site.siteMetadata.siteUrl + path },
                  // https://sitemaps.com/es/page-path
                  { lang: 'de', url: `${site.siteMetadata.siteUrl}/de${path}` },
                  // The default in case page for user's language is not localized.
                  { lang: 'x-default', url: site.siteMetadata.siteUrl + path } 
                ]
              };
            })
          }
       }
    

    来源:https://github.com/gatsbyjs/gatsby/issues/4603

    不要尝试将其拆分为单独的函数,至少在确保它按预期工作之前是这样。

    【讨论】:

    • 您好,谢谢您的回答。在我将 gatsby 升级到 v3 和站点地图插件之前,这曾经有效。奇怪的是它不再起作用了。我知道,该站点地图仅在生产构建中创建,我的意思是查询本身可以正常工作并返回结果。我还尝试传递 languages: {in: "en"} 而不是变量,它抛出了同样的错误。但我会尝试你的建议,非常感谢!
    • 嗯,这是一条新的相关信息。对于这种情况,由于 v3 实现依赖于插件,而不是在 Gatsby 中,直到插件更新它们的依赖关系并修复错误,您可能无法以与您相同的方式使用它......至少对于一会儿……
    • 同意,我用有关版本升级的信息更新了我的原始帖子,可能对偶然发现的人有用。
    • 是的,很明显它不喜欢 filter 内部查询。无论您传递变量还是静态值,它都会失败并出现相同的错误。仅当您省略 filter 时,错误才会消失,我想唯一的解决方案是提取所有内容,然后我自己的 filter 结果。
    • 这是一个很好的方法,至少现在是这样。我猜想需要回调的循环可能有问题。无论如何,调试得很好:)
    猜你喜欢
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2012-03-17
    • 2021-09-12
    • 2019-12-05
    • 1970-01-01
    相关资源
    最近更新 更多