直到服务器在meteor

时间:2015-08-14 06:43:13

标签: javascript node.js meteor sitemap

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

我在服务器启动功能中添加了一些初始化数据(创建一些帖子)并在服务器中使用下面的代码( 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内容时。

我认为在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正确显示了网站地图文件,但所有网站地图都是空的,如下所示:

<urlset> </urlset>

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

这是正常行为,Meteor.startup上的代码只会在应用启动时运行一次。如果您正在寻找重新运行此功能,您需要使用meteor方法从客户端调用该函数,或者您可以使用类似cron作业的东西来运行重复作业,这是一个很棒的包https://atmospherejs.com/percolate/synced-cron