基于 Egg.js 博客添加 RSS 功能

912 阅读2分钟

什么是 RSS ?

1.RSS 指 Really Simple Syndication(真正简易联合)

2.RSS 使您有能力聚合(syndicate)网站的内容

3.RSS 定义了非常简单的方法来共享和查看标题和内容

4.RSS 文件可被自动更新

5.RSS 允许为不同的网站进行视图的个性化

6.RSS 使用 XML 编写 以上引用自runoob.com

查找资料过程中,发现了砺心这篇文章非常详细,可以作为深入了解 RSS。

RSS 如何运行

RSS 用于在网站间分享信息。使用 RSS,您在名为聚合器的公司注册您的内容。

步骤之一是,创建一个 RSS 文档,然后使用 .xml 后缀来保存它。然后把此文件上传到您的网站。接下来,通过一个 RSS 聚合器来注册。每天,聚合器都会到被注册的网站搜索 RSS 文档,校验其链接,并显示有关 feed 的信息,这样客户就能够链接到使他们产生兴趣的文档。

如何为博客添加 RSS ?

RSS的基本格式非常简单,如下示例:

<?xml version="1.0" encoding="UTF-8" ?>
  <rss version="2.0">
  <channel>
    <title>菜鸟教程首页</title>
    <link>https://fishbone.live/</link>
    <description>Fishbone 的技术博客</description>
    <item>
      <title>基于Egg.js的博客增加RSS功能</title>
      <link>https://fishbone.live/article/9</link>
      <description>什么是 RSS ?</description>
    </item>
    <item>
      <title>博客增加评论功能</title>
      <link>https://fishbone.live/article/10</link>
      <description>如何基于React,NodeJs,MySQL,开发一个类似于掘金的评论模块</description>
    </item>
  </channel>
</rss>

本博客是使用Egg.js 添加 RSS 功能步骤如下:

1.查询出最新的 10 - 20 篇文章

async getTop10Articles() {
  try {
    const result = await this.app.mysql.select('ARTICLE', { 
      columns: ['id', 'uniqueMark', 'intro', 'title', 'createTime', 'publishTime' ],
      where: { isPublished: 1 },
      orders: [['publishTime','desc']],
      limit: 10,
      offset: 0,
      })
    return result
  } catch(error) {
    const { CUSTOM_ERROR, ERROR_TYPE } = this.ctx.helper
    this.ctx.throw(new CUSTOM_ERROR(ERROR_TYPE.SERVER_ERROR, error))
  }
}

2.根据查询出的文章动态生产 RSS XML 文档

const fs = require('fs')
const { Feed } = require('rss2')
const writeXML = function(xml, ctx) {
  return new Promise(resolve => {
    fs.writeFile('./app/public/rss.xml', xml, (err) => {
      if (!err) resolve({ result: 'ok' })
      else ctx.logger.error(err)
    })
  })
}
const posts = await ctx.service.customized.article.getTop10Articles()
posts.forEach(post => {
  const { title, uniqueMark, intro, createTime } = post
  const postUrl = `${address}article/${uniqueMark}`
  const author = [
    {
      name: `${name} Yu`,
      email,
      link: address
    }
  ]
  feed.addItem({
    title: title,
    id: postUrl,
    link: postUrl,
    description: intro,
    content: intro,
    author: [author],
    date: new Date(createTime),
  })
})
const writeXMLresult = await writeXML(feed.rss2(), ctx)
return writeXMLresult

3.点击页面 RSS 图标导航到 rss.js 页面调用步骤 2 接口(动态生成 RSS XML 数据)并跳转到生成的 rss.xml 文件。

const getRss = function() {
  return new Promise(resolve => {
    axios.get('/api/rss').then(res => {
      resolve(res);
    })
  })
}
const Page = () => {
  useEffect(() => {
    const getxml = async () => {
      const res = await getRss()
      if (res.data.result === 'ok') location.href = '/rss.xml'
    }
    getxml()
  }, [])
  return <div>loading RSS XML</div>
}

如果本地浏览器有装 RSS 插件,跳转到 rss.xml 时候会弹出订阅窗口如下: 说明已经成功了!其他访客得到你的 RSS 源就可以订阅了,有新的文章发布,访客不用打开你的站点就会收到通知。