2015-08-14 33 views
8

我正在使用流星來創建簡單的博客系統。對於站點地圖文件,我使用的是this包。直到服務器重新啓動流星時才創建站點地圖

我添加了一些初始化在服務器啓動功能(創建一些後)數據和在服務器下面的代碼(服務器/ 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); }); 
}); 

而且我已經啓動這樣的:(服務器/ startup.js

Meteor.startup(function() { 
    // some post and category created here 
}); 

但站點地圖並不存在,直到服務器重啓(我robots.t xt文件也是空的),但當服務器重新啓動sitemaps和robots.txt內容爲我創建。

我認爲帖子插入sitemaps.js之後,但問題是什麼人,以及如何解決這個問題?

新的嘗試:

我嘗試新的解決方案如下圖所示,但這代碼也沒有工作。 (我想創建單獨的sitemap文件爲每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節目Sitemaps文件正確,但是所有的網站地圖是空的是這樣的:

<urlset> </urlset> 

什麼時候sitemaps.add()運行?我認爲它在服務器重新啓動,但新的嘗試令我失望,我認爲我的猜測是不正確的,如果sitemaps.add()運行,爲什麼它是空的。

+0

你的文件夾結構是什麼樣的? – forallepsilon

+0

我描述的問題。我在服務器文件夾中有一個sitemaps.js – b24

回答

3

你的問題似乎成爲文件夾結構。你說你有/server/sitemaps.js和/server/startup.js,你希望這個站點地圖可以在你啓動後運行,但是Meteor會按字母順序運行這些文件,所以在啓動之前有一個站點地圖。如果你把你的startup.js放在一個lib文件夾中,比如/server/lib/startup.js,你會得到想要的結果,因爲Meteor會在別人之前運行lib文件夾。

+0

我認爲按字母順序排列不在這裏,因爲當訪問/sitemap.xml時,sitemaps.js代碼不按順序運行。你對第二代碼有什麼想法? – b24

+0

你沒有說你有一個顯示你的站點地圖的路線。你能在這裏發佈路線代碼嗎?另外,你說第二個代碼在robots.txt中給你正確的結果,但是生成robots.txt的代碼是什麼?它是否正確地擁有了所有的sitemap1.xml,sitemap2.xml等? –

+0

我說第二個代碼作爲路線工作。是robots.txt包含所有站點地圖(sitemap1.xml,sitemap2.xml,...),但所有文件均爲空。 – b24

1

這是正常的行爲,Meteor.startup的代碼只會在應用程序啓動時運行一次。如果你想重新運行這個功能,你需要使用流星法來調用客戶端的功能,或者你可以使用類似cron job的東西來運行重複作業,這裏是一個很棒的包裝https://atmospherejs.com/percolate/synced-cron

+0

我不想重新運行我的啓動代碼。我的啓動是一些初始化數據,但沒有顯示在站點地圖中。 – b24

相關問題