【问题标题】:Gatsby's mapping between markdown filesGatsby 的 markdown 文件之间的映射
【发布时间】:2021-05-05 07:18:33
【问题描述】:

我正在创建一个多作者网站(使用gatsby-plugin-mdx)并具有以下文件结构:

/posts
- /post-1/index.mdx
- /post-2/index.mdx
- ...
/members
- /member-a/index.mdx
- /member-b/index.mdx
- ...

post 页面的前端,我有很多作者,比如

authors: [Member A, Member B]

而且我在作者的markdown文件的frontmatter中有作者的名字。

我想设置架构,这样当我查询帖子时,我还可以获得作者的详细信息(姓名、电子邮件等)。

从阅读this page 看来,我似乎需要创建一个自定义解析器...但我看到的所有示例都将所有作者都放在一个json 文件中(所以你有两个集合,MarkdownRemark 和@987654330 @... 虽然我认为我的所有帖子和成员都在 MarkdownRemark 收藏中。

非常感谢!

【问题讨论】:

  • 这是文档中关于映射外键字段的部分:gatsbyjs.com/docs/reference/graphql-data-layer/…
  • @LekoArts 谢谢。不要认为我对文档的理解不足以让它为我工作:P(得到像GraphQLError: Field "authors" of type "[Mdx]" must have a selection of subfields. Did you mean "authors { ... }"? 这样的东西)我最终做了类似this 的事情,这并不理想,但它确实有效。很想听听你的想法。

标签: graphql gatsby gatsby-plugin-mdx


【解决方案1】:

我最终会做这样的事情。当然有一种更清洁的方法,但它对我有用。它遍历所有Mdx,并将一个名为authors 的字段添加到所有Mdx 类型中进行查询。

这样做的一个问题是authorsmembers 下也有,这并不理想。更好的方法是定义新类型并将最后一个解析器中的Mdx 更改为新的帖子数据类型。不知道如何让它工作。最后,我可以查询如下内容:

query MyQuery {
  posts {
    frontmatter {
      title
      subtitle
    }
    authors {
      frontmatter {
        name
        email
      }
    }
  }
}
exports.createResolvers = ({ createResolvers }) => {
  const resolvers = {
    Mdx: {
      authors: {
        type: ["Mdx"],
        resolve(source, args, context, info) {
          return context.nodeModel.runQuery({
            query: {
              filter: {
                fields: {
                  collection: { eq: "members" }
                },
                frontmatter: {
                  memberid: { in: source.frontmatter.authors },
                },
              },
            },
            type: "Mdx",
            firstOnly: false,
          })
        }
      }
    },
  }
  createResolvers(resolvers)
}

【讨论】:

    猜你喜欢
    • 2011-02-01
    • 2019-08-26
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多