如何从内容丰富的 RSS 源数据中获取 html 元素(gatsby-plugin-feed)

How to get the html elements from Contentful Raw Data for RSS-feeds (gatsby-plugin-feed)

我正在忙着尝试使用 gatsby-plugin-feed@3.4.0gatsby@3.4.0(最新的最新的)来解决我的 RSS 源的最新重大变化。

这是我的配置:(gatsby-config.js)

{
      resolve: 'gatsby-plugin-feed',
      options: {
        query: `
          {
            site {
              siteMetadata {
                title
                author
                description
                bizEmail
                authorEmail
                siteUrl
                site_url: siteUrl
              }
            }
          }
        `,

        setup: ({ query: { site } }, options) => ({
          ...options,
          title: 'Menefex WMB: RSS Feeds',
          description: site.siteMetadata.description,
          site_url: site.siteMetadata.siteUrl,
          feed_url: `${site.siteMetadata.siteUrl}/rss.xml`,
          image_url: 'https://i.postimg.cc/JnqZPb3f/Gx-FAVICON.png',
          webMaster: `${site.siteMetadata.bizEmail} (${site.siteMetadata.title})`,
          managingEditor: `${site.siteMetadata.authorEmail} (${site.siteMetadata.author})`,
          copyright: `© 2019 - ${new Date().getFullYear()} ${
            site.siteMetadata.title
          }, Alle rechten voorbehouden.`,
          language: 'nl',
          generator: 'GatsbyJS',
          ttl: '60',
          custom_namespaces: {
            webfeeds: 'http://webfeeds.org/rss/1.0',
          },
          custom_elements: [
            {
              'webfeeds:cover': {
                _attr: {
                  image: 'https://i.postimg.cc/WbsmfwKc/Gx-NEWLOGO.png',
                },
              },
            },
            { 'webfeeds:icon': 'https://i.postimg.cc/JnqZPb3f/Gx-FAVICON.png' },
            { 'webfeeds:logo': 'https://i.postimg.cc/JnqZPb3f/Gx-FAVICON.png' },
            { 'webfeeds:accentColor': 'FFCC00' },
            {
              'webfeeds:related': {
                _attr: {
                  layout: 'card',
                  target: 'browser',
                },
              },
            },
          ],
        }),

        feeds: [
          {
            serialize: ({ query: { site, allContentfulBlogPost } }) =>
              allContentfulBlogPost.edges.map((edge) => ({
                title: edge.node.title,
                author: site.siteMetadata.authorEmail,
                description: edge.node.subtitle,
                date: edge.node.updatedAt,
                url: `${site.siteMetadata.siteUrl}/blog/${edge.node.slug}`,
                guid: edge.node.updatedAt,
                enclosure: {
                  url: `https:${edge.node.image.file.url}`,
                },
                custom_elements: [
                  {
                    'webfeeds:featuredImage': `https:${edge.node.image.file.url}`,
                  },
                  {
                    'content:encoded': JSON.stringify(edge.node.body),
                  },
                ],
              })),

            query: `
              {
                allContentfulBlogPost(sort: { fields: publishedDate, order: DESC }) {
                  edges {
                    node {
                      title
                      subtitle
                      slug
                      updatedAt
                      body {
                        raw
                        references {
                          ... on ContentfulAsset {
                            contentful_id
                            __typename
                            fixed(width: 1600) {
                              width
                              height
                              src
                              srcSet
                            }
                          }
                        }
                      }
                      image {
                        file {
                          url
                        }
                      }
                    }
                  }
                }
              }
            `,

            output: '/rss.xml',
            title: 'Menefex WMB: RSS Feeds',
            // optional configuration to insert feed reference in pages:
            // if `string` is used, it will be used to create RegExp and then test if pathname of
            // current page satisfied this regular expression;
            // if not provided or `undefined`, all pages will have feed reference inserted
            match: '^/blog/',
            // optional configuration to specify external rss feed, such as feedburner
            link: 'https://feeds.feedburner.com/GimmixWMB',
          },
        ],
      },
    },

通过上面的代码,我得到了下面的代码; (焦点:content:encoded)。我认为这不是 good/enough 查看我的 rssfeeds 的正确方式。 如何将原始数据解析为 html 个元素?


在将我的 Gatsby 项目迁移到 v3 之前,我曾经让这段代码处于工作状态: 它现在抱怨使用 CreateType/createSchemaCustomization 函数并且我的 rssHtml 在 GrapQhl 游乐场无法访问。

我的gatsby-node.js


const { documentToHtmlString } = require('@contentful/rich-text-html-renderer');

exports.createResolvers = ({ createResolvers }) => {
  createResolvers({
    contentfulBlogPostBodyRichTextNode: {
      rssHtml: {
        type: 'String',
        resolve: (source) => documentToHtmlString(source),
      },
    },
  });
};

我在这里缺少什么? 在此先感谢。

查看您的屏幕截图,edge.node.bodyraw 字段,我认为这就是您要解析的内容。尝试将该值传递给 documentToHtmlString 调用

        resolve: (source) => documentToHtmlString(JSON.parse(source.raw)),

并在您的 RSS 提要配置中传递新的解析值

                      'content:encoded': edge.node.body.rssHtml,

您不妨尝试在 gatsby-config.js 文件中直接使用 @contentful/rich-text-html-renderer 并避免添加自定义解析器

const { documentToHtmlString } = require('@contentful/rich-text-html-renderer');

...
                    'content:encoded': documentToHtmlString(edge.node.body.raw),
...