node建站笔记——生成rss订阅与sitemap站点地图

小鸡
阅读409 喜欢4 博客 node 更新2019-5-26

之前做的静态博客有rss生成插件,可以直接在博客渲染时自动生成静态的rss.xml文件,然而对于node搭建的动态站点,我似乎并没有找到合适的插件,而且就目前的需求来讲,网上也不会有我想要的插件。既然没轮子,那就自己来造。

其实是很简单的一件事,获取数据库中文章的部分需要的内容,以xml的格式写入rss.xml文件就好了。这里我用了动态生成,静态获取的方式。就是rss.xml文件的每次生成只在文章插入数据库的函数触发时发生。简而言之就是——数据库有更新时我才重新生成rss.xml文件。这样即保证了rss文件的新鲜,又不占用node程序的内存。

rss生成函数

其中,connection是调用了数据库连接函数,fs调用系统的文件读写函数,until是一个我自己定义的时间函数库config包含一些站点信息。

可以看,下面一条selectsql查询数据库按更新日期递减的前30篇文章,之后将查询结果加入字符串rss_content,这个简单的代码便轻松生成了一个rss.xml文件

const connection = require("../config/db").connection;
const fs = require("fs");
const until = require("../../until/until");
const config = require("../../config");
var index = config.seo.index;

var selectsql=`select post_content,id,title,updateTime,description from articles where type = "post" order by updateTime desc limit 30`;

exports.createrss = function(){
var rss_content = `
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
<channel>
<title>${config.seo.title}</title>
<link>${index}</link>
<atom:link href="/rss.xml" rel="self" type="application/rss+xml"/>
<description>${config.options.description}</description>
<pubDate>${until.nowDate}</pubDate>
<generator>${index}/</generator>

`;
connection.query(selectsql, function(err, rows){
if(err){
console.log(err);
return;
}
for(var i in rows){
rss_content = rss_content + `
<item>
<title>${rows[i].title}</title>
<link>${index}/post/${rows[i].id}</link>
<guid>${index}/post/${rows[i].id}</guid>
<pubDate>${rows[i].updateTime}</pubDate>
<description>
${rows[i].description}
</description>
<content:encoded>
<![CDATA[${rows[i].post_content}]]>
</content:encoded>
<comments>
${index}/post/${rows[i].id}#disqus_thread
</comments>
</item>
`;
}
rss_content = rss_content + `</channel>
</rss>`
fs.writeFile("public/rss.xml", rss_content, function (err) {
if(err) {
console.error(err);
} else {
console.log("写入成功");
return;
}
});
return;
});
}


在文章插入时调用

我的站点是前台编写文章的,数据传入后台后会调用一个insertArticle函数来将新的文章插入数据库,那么我们只要在插入数据库操作之后再调用rs生成函数便可以保持rss文件的实时更新。


const connection = require("../config/db").connection;
const createrss = require("../file/rss").createrss;

exports.insertArticle = (req, res) =>{
// 其他代码
var sql = "插入语句"
connection.query(sql,function(err,rows){
if(err){
console.log(err)
}
else{
createrss();
res.end("succeed");
}
});
};


将rss放在静态文件夹里

这里的rss文件由于是生成的静态文件,所以我也没必要为它写一个路由函数来处理请求,直接扔到静态文件夹里就可以访问了。express设置静态文件夹

app.use(express.static(path.join(__dirname, "public")));


生成sitemap.xml文件

同样的方法,我们也可以生成站点地图

sitemap.xml文件的格式更简单了,它就像。。。这样

<url>
<loc>https://me.idealli.com/post/2af9e880.html</loc>
<lastmod>Mon May 01 2017 00:00:00 GMT+0800 (中国标准时间)</lastmod>
</url>
<url>
<loc>https://me.idealli.com/post/e04183d2.html</loc>
<lastmod>Wed May 03 2017 00:00:00 GMT+0800 (中国标准时间)</lastmod>
</url>
<url>
<loc>https://me.idealli.com/post/e27849b.html</loc>
<lastmod>Thu May 04 2017 00:00:00 GMT+0800 (中国标准时间)</lastmod>
</url>

所以我们的代码也很简单,在rss文件生成函数的基础上去掉点东西就好了。

var sitemap_content = `<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" 
xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" 
xmlns:xhtml="http://www.w3.org/1999/xhtml"
 xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" 
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
 xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">`;   


connection.query(sitemapsql, function(err, rows){
if(err){
console.log(err);
return;
}
for(var i in rows){
sitemap_content = sitemap_content + `
<url>
<loc>${index}/post/${rows[i].id}</loc>
<lastmod>${rows[i].updateTime}</lastmod>
</url>
`;

}
sitemap_content = sitemap_content + `</urlset>`;
fs.writeFile("public/sitemap.xml", sitemap_content, function (err) {
if(err) {
console.error(err);
} else {
console.log("写入sitemap成功");
}
});
});


代码就是这么简单,可以自行修改加入一些自己想要的元素。

没了,告辞