我正在使用流星创建一个简单的博客系统。对于sitemaps文件,我使用这个包。
我在服务器启动功能中添加了一些初始化数据(创建一些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
});
但是sitemaps不存在,直到服务器重启(我的robots.txt文件也是空的),但当服务器重启sitemaps和robots.txt内容为我创建。
我认为在sitemaps.js之后插入的帖子,但问题是什么,伙计们,如何解决这个问题?
新尝试:
我尝试像下面这样的新解决方案,但这段代码也不起作用。(我想为每10000个类别创建单独的站点地图文件,以防止大站点地图和谷歌站点地图错误):
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正确显示sitemap文件,但是所有的sitemap都是空的,像这样:
<urlset> </urlset>
sitemaps.add()何时运行?我认为它确实在服务器重启,但新的尝试让我失望,我认为我的猜测是不正确的,如果sitemaps.add()运行为什么它是空的。
您的问题似乎是文件夹结构。你说你有/server/sitemaps.js和/server/startup.js,你希望sitemaps会在启动后运行,但问题是Meteor会按字母顺序运行这些文件,所以sitemap在启动前出现。如果你把startup.js放在lib文件夹中,比如/server/lib/startup.js,你会得到想要的结果,因为Meteor会先运行lib文件夹。
这是Meteor的正常行为。Startup将在应用启动时只运行一次。如果你想重新运行这个函数你需要使用meteor方法从客户端调用函数或者你可以使用cron job来运行重复作业这里有一个很好的包https://atmospherejs.com/percolate/synced-cron