在流星中重新启动服务器之前不会创建站点地图
sitemap not created until server restart in meteor
我正在使用流星创建简单的博客系统。对于站点地图文件,我使用的是 this 包。
我在服务器启动函数中添加了一些初始化数据(创建一些post)并在服务器中使用下面的代码(server/sitemaps.js)来创建每个类别的站点地图(例如 sitemap1.xml 第一个类别等):
function sitemapOutput(categoryName){
var out = [], posts = Posts.find({ category: categoryName }).fetch();
_.each(posts, function(post) {
out.push({
page: post.url(),
lastmod: post.insertDate,
changefreq: 'weekly'
});
});
return out;
}
Categories.find().forEach(function(Category, index) {
sitemaps.add('/sitemap' + (index+1) +'.xml',
function(){ return sitemapOutput(Category.name); });
});
我有这样的启动:(server/startup.js)
Meteor.startup(function () {
// some post and category created here
});
但是站点地图在服务器重新启动之前不存在(我的 robots.txt 文件也是空的)但是当服务器重新启动站点地图并且 robots.txt 内容为我创建时。
我认为 post 插入在 sitemaps.js 之后,但是问题是什么,如何解决?
新尝试:
我尝试了如下新的解决方案,但这段代码也不起作用。 (我想为每个 10000 个类别创建单独的站点地图文件,以防止站点地图过大和 google 站点地图错误):
for (var i=0;i<=Math.round(Categories.find().count()/10000);i++) {
sitemaps.add('/sitemap' + i +'.xml', function(){
var out = [];
Categories.find({}, {sort: {insertDate: 1} ,limit: 10000, skip: i * 10000}).forEach(function(Category) {
out.push({
page: "/category/" + Category.title + "/" + Category._id,
lastmod: Category.insertDate,
changefreq: 'weekly'
});
});
return out;
});
}
robots.txt 正确显示站点地图文件,但所有站点地图都是空的,如下所示:
<urlset> </urlset>
sitemaps.add() 运行什么时候开始?我认为它在服务器重启时确实如此,但是 New try 让我很失望,我认为我的猜测是不正确的,如果 sitemaps.add() 是 运行 为什么它是空的。
这是正常行为,Meteor.startup 处的代码将 运行 仅在应用程序启动时执行一次。如果你想重新 运行 这个函数,你要么需要使用 meteor 方法从客户端调用函数,要么你可以使用 cron 作业之类的东西来 运行 重复作业,这里是一个很棒的包https://atmospherejs.com/percolate/synced-cron
您的问题似乎是文件夹结构。你说你有 /server/sitemaps.js 和 /server/startup.js,你希望站点地图在你启动后会 运行,但事实是 Meteor 会 运行 这些文件按字母顺序排列,所以站点地图在启动之前出现。如果你把你的 startup.js 放在一个 lib 文件夹里,比如 /server/lib/startup.js,你会得到想要的结果,因为 Meteor 会先 运行 lib 文件夹。
我正在使用流星创建简单的博客系统。对于站点地图文件,我使用的是 this 包。
我在服务器启动函数中添加了一些初始化数据(创建一些post)并在服务器中使用下面的代码(server/sitemaps.js)来创建每个类别的站点地图(例如 sitemap1.xml 第一个类别等):
function sitemapOutput(categoryName){
var out = [], posts = Posts.find({ category: categoryName }).fetch();
_.each(posts, function(post) {
out.push({
page: post.url(),
lastmod: post.insertDate,
changefreq: 'weekly'
});
});
return out;
}
Categories.find().forEach(function(Category, index) {
sitemaps.add('/sitemap' + (index+1) +'.xml',
function(){ return sitemapOutput(Category.name); });
});
我有这样的启动:(server/startup.js)
Meteor.startup(function () {
// some post and category created here
});
但是站点地图在服务器重新启动之前不存在(我的 robots.txt 文件也是空的)但是当服务器重新启动站点地图并且 robots.txt 内容为我创建时。
我认为 post 插入在 sitemaps.js 之后,但是问题是什么,如何解决?
新尝试:
我尝试了如下新的解决方案,但这段代码也不起作用。 (我想为每个 10000 个类别创建单独的站点地图文件,以防止站点地图过大和 google 站点地图错误):
for (var i=0;i<=Math.round(Categories.find().count()/10000);i++) {
sitemaps.add('/sitemap' + i +'.xml', function(){
var out = [];
Categories.find({}, {sort: {insertDate: 1} ,limit: 10000, skip: i * 10000}).forEach(function(Category) {
out.push({
page: "/category/" + Category.title + "/" + Category._id,
lastmod: Category.insertDate,
changefreq: 'weekly'
});
});
return out;
});
}
robots.txt 正确显示站点地图文件,但所有站点地图都是空的,如下所示:
<urlset> </urlset>
sitemaps.add() 运行什么时候开始?我认为它在服务器重启时确实如此,但是 New try 让我很失望,我认为我的猜测是不正确的,如果 sitemaps.add() 是 运行 为什么它是空的。
这是正常行为,Meteor.startup 处的代码将 运行 仅在应用程序启动时执行一次。如果你想重新 运行 这个函数,你要么需要使用 meteor 方法从客户端调用函数,要么你可以使用 cron 作业之类的东西来 运行 重复作业,这里是一个很棒的包https://atmospherejs.com/percolate/synced-cron
您的问题似乎是文件夹结构。你说你有 /server/sitemaps.js 和 /server/startup.js,你希望站点地图在你启动后会 运行,但事实是 Meteor 会 运行 这些文件按字母顺序排列,所以站点地图在启动之前出现。如果你把你的 startup.js 放在一个 lib 文件夹里,比如 /server/lib/startup.js,你会得到想要的结果,因为 Meteor 会先 运行 lib 文件夹。