Gatsby.js-allMarkdownRemark中的GraphQL查询pdf文件

Lor*_*ler 5 javascript reactjs graphql gatsby

我目前正在为一个学校项目建立一个盖茨比站点,遇到了我自己不知道的事情。

基本上我有一些markdown文件。它们包含一个名为“ file”的前题字段,并带有另一个文件名(例如:“ test.pdf”)作为值。我需要知道这些文件的公共URL。

我试图这样写我的查询:

     query SiteQuery{
           publications: allMarkdownRemark(
               filter: { fileAbsolutePath: {regex : "/publications/"} },
               sort: { order: DESC, fields: [frontmatter___date] },
           ){
             edges {
               node {
                 frontmatter {
                   date(formatString: "MMMM DD, YYYY"),
                   title,
                   file{
                     publicURL                   
                   }
                 }
              }
            }
         }
    }
Run Code Online (Sandbox Code Playgroud)

但是它总是将字段“文件”解释为字符串,我认为这很奇怪,因为我已经对以下图像执行了相同的过程:

...
    node {
      frontmatter {
        date(formatString: "MMMM DD, YYYY"),
        title,
        picture {
          childImageSharp {
            fluid{
              ...GatsbyImageSharpFluid
            }
          }
        }
      } 
    } 
...
Run Code Online (Sandbox Code Playgroud)

我已经在寻找答案,但是我能找到的最有用的结果是在此站点上:https : //www.gatsbyjs.org/docs/adding-images-fonts-files/

但是我无法使它工作。

有人可以告诉我我在做什么错吗?

当然,我总是可以使用'allFile'编写第二个查询,然后通过绝对路径将markdown文件与pdf文件进行匹配,但是我希望有一个更好的解决方案。

Fly*_*tsu 2

这是您想要使用 的时候mapping,但对于非 Markdown 或 JSON 文件的任何内容都没有很好的文档记录。

gatsby-config.js - 映射

// NOTE: the frontmatter `file` and property `base` must have unique values
// That is, don't allow any files to have the same name if mapping `base`
mapping: {
    'MarkdownRemark.frontmatter.file' : 'File.base',
}
Run Code Online (Sandbox Code Playgroud)

所以现在你可以成功地做到:

query SiteQuery{
    publications: allMarkdownRemark(
        filter: { fileAbsolutePath: {regex : "/publications/"} }
        sort: { order: DESC, fields: [frontmatter___date] }
    ){
       edges {
           node {
               frontmatter {
                   date(formatString: "MMMM DD, YYYY")
                   title
                   file {
                       publicURL                   
                   }
               }
           }
       }
    }
}
Run Code Online (Sandbox Code Playgroud)