直到服务器在meteor中重启才创建站点地图

b24*_*b24 8 javascript sitemap node.js meteor

我正在使用meteor来创建简单的博客系统.对于站点地图文件,我正在使用包.

我在服务器启动函数中添加了一些初始化数据(创建一些帖子)并在服务器中使用下面的代码(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); });
});
Run Code Online (Sandbox Code Playgroud)

我有这样的启动:(server/startup.js)

Meteor.startup(function () {
    // some post and category created here
});
Run Code Online (Sandbox Code Playgroud)

但是,在服务器重启(我的robots.txt文件也为空)之前,站点地图不存在,但是当服务器重新启动站点地图并为我创建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;
    });
}
Run Code Online (Sandbox Code Playgroud)

robots.txt正确显示站点地图文件,但所有站点地图都是空的,如下所示:

<urlset> </urlset>
Run Code Online (Sandbox Code Playgroud)

sitemaps.add()什么时候运行?我认为它确实在服务器重启时,但是新尝试让我很失望,我认为我的猜测是不正确的,如果运行sitemaps.add(),为什么它是空的.

Mar*_*idt 3

您的问题似乎是文件夹结构。你说你有 /server/sitemaps.js 和 /server/startup.js 并且你希望站点地图在启动后运行,但问题是 Meteor 会按字母顺序运行这些文件,所以站点地图在启动之前出现。如果将startup.js 放在lib 文件夹中,例如/server/lib/startup.js,您将获得所需的结果,因为Meteor 将在其他文件夹之前运行lib 文件夹。