在流星中重新启动服务器之前不会创建站点地图

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 文件夹。