直到服务器在流星中重新启动才创建站点地图



我正在使用流星创建一个简单的博客系统。对于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

最新更新