从远程源获取订阅列表 JSON,定时爬取解析其中的 Atom/RSS 订阅源,并以 API 的形式提供文章列表。
前端:
- Nitro:UnJS 家族的 Web 服务器,基于文件路由,支持定时任务
- Mongoose:MongoDB 的 ODM,用于操作数据库
- Fast XML Parser:用于解析 Atom/RSS
- env-cmd:用于在生产环境加载
.env
变量
环境:
blog-feed
├── .env # 环境变量
├── eslint.config.mjs # ESLint 配置
├── nitro.config.mjs # Nitro 配置
├── models # 数据模型
│ └── article.ts # 文章模型
├── route # 基于文件的路由
│ ├── index.get.ts # 状态 API
│ ├── article.get.ts # 文章 API
│ └── manual-update.post.ts # 手动更新 API
├── tasks # 定时任务
│ └── update.ts # 爬取文章并更新数据库
└── utils # 工具函数
├── db.ts # 数据库操作
└── feed.ts # Feed 解析
在项目根目录下创建 .env
文件,或配置环境变量:
# MongoDB 连接字符串
MONGO_URI="mongodb://user:password@localhost:27017/blog-feed"
在 nitro.config.ts
中配置订阅源集合:
export default defineNitroConfig({
// ...
runtimeConfig: {
feedSource: 'https://gh.llkk.cc/https://github.com/xiyou-linuxer/website-2024/blob/main/docs/.vitepress/data/members.json', // 订阅源集合
nameKey: 'name', // 订阅源名称字段,用于日志打印
tagKey: 'grade', // 订阅源标签字段,用于查询时分类
feedKey: 'feed', // 订阅源地址字段
},
})
在项目根目录下运行以下命令:
pnpm i
pnpm dev
PM2 是一个进程管理器,用于在生产环境中管理 Node.js 应用程序。
pnpm i pm2 -g
在项目根目录下运行以下命令:
pnpm i # 安装依赖
pnpm build # 构建项目
pnpm preview # 前台运行
pnpm start # 后台运行
pnpm stop # 停止后台运行
pnpm restart # 重启后台运行
当项目有更新时,直接运行 pnpm hot
即可,无需重新启动项目。
获取服务器状态信息,返回结构:
{
"status": "success",
"packageJson": {
// package.json 内容
}
}
获取文章列表,支持按订阅源、标签筛选,支持分页。
参数 | 说明 | 示例 |
---|---|---|
page |
页码(默认 1) | /articles?page=1 |
limit |
每页文章数(默认 10) | /articles?limit=10 |
feed |
按订阅源筛选 | /articles?feed=https://blog.zhilu.cyou/atom.xml |
tag |
按标签筛选 | /articles?tag=1 |
{
"result": "success",
"pagination": {
"page": 1,
"limit": 24,
"total": 151,
"totalPages": 7
},
"articles": [
{
"_id": "67c6694d53318941f8373de2",
"link": "https://blog.zhilu.cyou/2024/vitepress-enhancement",
"__v": 0,
"author": "纸鹿摸鱼处",
"createdAt": "2025-03-04T02:45:26.719Z",
"date": "2024-11-03T09:54:50.000Z",
"description": "VitePress 的基本使用与定制技巧,涵盖项目初始化、汉化配置、图标引入、自定义主题等内容,旨在利用 VitePress 构建美观、高效的静态站点。",
"feed": "https://blog.zhilu.cyou/atom.xml",
"tag": "2022",
"title": "VitePress 不完全优化指南"
}
// ...
]
}
触发文章列表的手动更新。