【问题标题】:sitemap not created until server restart in meteor在流星中重新启动服务器之前未创建站点地图
【发布时间】:2015-11-07 08:10:49
【问题描述】:

我正在使用流星创建简单的博客系统。对于站点地图文件,我使用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() 何时运行?我认为它会在服务器重新启动时发生,但 New try 让我很失望,我认为我的猜测是不正确的,如果运行了 sitemaps.add() 为什么它是空的。

【问题讨论】:

  • 你的文件夹结构是什么样的?
  • 我描述的有问题。我在服务器文件夹中有一个 sitemaps.js

标签: javascript node.js meteor sitemap


【解决方案1】:

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

【讨论】:

  • 我认为这里不按字母顺序排列,因为当访问 /sitemap.xml 时,sitemaps.js 代码作为路由运行,而不是按顺序排列。你对第二个代码有什么想法?
  • 您没有说您有显示站点地图的路线。你可以在这里发布路线代码吗?另外,您说第二个代码在 robots.txt 中给出了正确的结果,但是生成 robots.txt 的代码是什么? sitemap1.xml、sitemap2.xml等所有的东西都正确吗?
  • 我说第二个代码用作路由。是的 robots.txt 包含所有站点地图(sitemap1.xml、sitemap2.xml、...),但所有文件都是空的。
  • 我没有路由。 sitemaps 包作者在本期 (github.com/gadicc/meteor-sitemaps/issues/13) 中表示,sitemaps.add() 函数动态创建站点地图(例如,当收到对 sitemap1.xml 的请求时)这种行为非常接近路由功能。对于第二个代码,我只有一个生成序列站点地图文件的 server/sitemaps.js 文件,但所有文件都是空的。
  • 那是你的问题。看,当服务器加载这个文件时,它会在你的 /server/startup.js 之前加载,一旦它运行,它会生成所有那些空的 sitemap.xml 文件。要查看它是否会产生影响,在您运行流星实例后,尝试在另一个终端上运行 meteor shell,然后复制并粘贴与您第二次尝试完全相同的代码。
【解决方案2】:

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

【讨论】:

  • 我不想重新运行我的启动代码。我的启动是一些初始化数据,但没有显示在站点地图中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
  • 2013-07-14
  • 2020-07-29
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多