2012-04-28 26 views
2

我玩弄使用Meteor作爲後端創建靜態html生成器(與管理用戶界面)的想法。動態添加文件到公共文件夾,並獲得流星刷新結果

我想,當觸發時,將在公共文件夾上創建一個新文件,並立即通過嵌入在html中的iframe進行審閱。

的文件被創建,但兩側的效果發生:

  1. 服務器重新啓動。
  2. 該文件被緩存 - 所以用戶無法看到發生了更改。

任何想法?

if (Meteor.is_client) { 

    Template.hello.events = { 
    'click input' : function() { 
     Meteor.call('makeFile', 'filename.html', function(error, result){ 
     alert(result); 
     }); 
    //window.location = '/filename.txt'; 

     // template data, if any, is available in 'this' 
     if (typeof console !== 'undefined') 
     console.log("You pressed the button"); 
    } 
    }; 
} 

if (Meteor.is_server) { 
    var fs = __meteor_bootstrap__.require('fs'); 
    Meteor.startup(function() { 
    // code to run on server at startup 

    }); 
    Meteor.methods({ 
    'makeFile': function(fileName) { 
     /* 
     fs.unlink("public/"+fileName, function (err) { 
     if (err) throw err; 
     console.log('successfully deleted '); 
     }); 
    */ 
     fs.writeFile("public/"+fileName, "<html><body><h1>test</h1></body></html>", function(err) { 
     if(err) { 
      console.log(err); 
     } else { 
      console.log("The file was saved! "+ fileName); 


     } 
     }); 
     return fileName; 
    } 
    }); 
} 

回答

2

我認爲流星服務器會在您更改meteor子目錄中的任何文件時重新啓動。因此,爲了防止這種情況,不要在流星應用程序目錄中編寫文件,請將create_files目錄設置爲上一級。無論如何,這是一個好主意,將生成的文件與生成它們的代碼分開。

在管理界面中顯示內容的最簡單方法可能是將其寫入數據庫(而不是試圖監視目錄更改)。因爲Meteor被設計爲觀察數據庫更新,所以沒有任何意義重新發明輪子。

創建集合(在頂部,所以它的客戶端&服務器上):

GeneratedFiles = new Meteor.Collection("generated_files"); 

寫在他們面前,並在您fs.writeFile回調然後指定文件的內容給一個變量:

if(err) { 
    console.log(err); 
} else { 
    GeneratedFiles.insert({name: fileName, contents: fileContents}); 
    console.log("The file was saved! "+ fileName); 
} 

然後將文件內容自動發佈到客戶端代碼中的模板中(不知道爲什麼要使用iframe,好像一個div可以正常工作,但無論哪種方式都可能工作)。

希望有所幫助。祝你好運,我認爲流星是這類事情的一個很好的框架。我使用的大多數管理界面仍然完全同步,只是煩人的工作。

+0

感謝您的想法 - 它看起來像它會做的伎倆 – Gavriguy 2012-04-29 18:16:41

相關問題