Nuxt生成rss订阅

前言

重新构建这个博客很大一个原因就是我想整合一下自己的订阅源,所以在一开始,我就想先把 rss 给加上去,但是看了几个 nuxt 的 module,感觉自定义都不是很高,而且文档也不怎么丰富。于是搜索了一下相关文章,找到了rss这个库,准备自己写一下生成逻辑。

rss 库 生成 xml 文本

rss

文档很明了

// 创建实例
const feed = new RSS({
  title: 'site title',
  description: 'some desc about you',
  feed_url: 'https://site.com/rss.xml',
  site_url: 'https://site.com'
})

const posts = [...]
// 将文章添加到feed
posts.forEach(post => {
  feed.item({
    title: post.title,
    description: post.description,
    ...
  })
})

// 生成xml字符串
const xml = feed.xml({ indent: true });

通过上述代码,就可以生成一串 rss.xml 文本,接下来,只需要通过 nuxt 的路由,为这串文本生成一个链接,让它可以访问即可。

使用 nuxt 将创建rss.xml路由

在 nuxt 中,server 文件夹下可以创建服务端路由,其中/api文件夹下会自动添加/api前缀,/routes文件夹则不会有前缀

这里我们要创建的路由路径为/rss.xml,直接在~/server/routes/文件夹下创建一个rss.xml.ts文件即可

export default defineEventHandler((event) => {
  const feed = new RSS({...});

  const posts = await serverQueryContent(event, "/").find();
  posts.forEach(p => {
    // 添加需要的rss属性
    feed.item({ ...p });
  });
  const feedStr = feed.xml({ indent: true });
  event.node.res.setHeader("content-type", "text/xml");
  // 返回xml响应
  event.node.res.end(feedString);
})

此时,访问路由localhost:port/rss.xml就可以看到生成的 rss 链接内容了

扩展:添加 follow 自定义属性

在 follow 中,想要认证你的订阅源,需要想 rss 中添加指定内容。有三种方式:在内容中添加、在 description 中添加、自定义标签

前两种很好解决,但可能会对其他 rss 工具的解析有影响(因为内容变了,使用自定义标签则可以做到不产生其他副作用

// 使用rss创建实例的时候,指定自定义的元素即可
const feed = new RSS({
  title: 'xxx',
  //...
  custom_elements: [
    follow_challenge: [
      { feedId: 'xxxxx' },
      { userId: 'xxxxx' }
    ]
  ]
})

添加完自定义标签内容之后,在 follow 上再点击认证就可以完成认证了!