2014-09-03 68 views
2

我需要將目錄中的文件列表傳遞給Meteor中的客戶端。如何在服務器上使用npm時使方法處於活動狀態

到目前爲止,我有這樣的:

if (Meteor.isClient) { 
     Meteor.call('getFiles', function(error, result) { 
      if (error) { 
       throwError(error.reason); 
      } else { 
       console.log(result); 
      } 
     }); 
} 


if (Meteor.isServer) { 
    Meteor.methods({ 
     'getFiles': function getFiles() { 
      var walk = Meteor.npmRequire('walk'); 
      var files = new Array(); 

      var walker = walk.walk('/test', { followLinks: false }); 

      walker.on('file', function(root, stat, next) { 
       files.push(root + '/' + stat.name); 
       next(); 
      }); 

      walker.on('end', function() { 
       console.log(files); 
      }); 

      return files; 
     } 
    }); 
} 

我可以看到服務器控制檯上的文件列表,但客戶端的控制檯返回一個空數組。我猜這是因爲在完成walker之前調用該方法,並簡單地返回在該方法中創建的空數組。

我的問題是,如何讓我這個反應?我希望每次在目錄中添加或刪除文件時都運行此方法。

回答

1

有你需要做的,以實現自己的目標兩件事情。

1)使流星方法等待異步結果,

2)使結果更新文件結構發生變化時。

第一個是比較容易的,並且通常與期貨實現。查看方法代碼this MeteorPad

Future = Npm.require('fibers/future'); 

Meteor.methods({ 
    async: function() { 
    var fut = new Future(); 
    Meteor.setTimeout(function() { 
     fut.return('Async world!'); 
    }, 2000); 
    return fut.wait(); 
    }, 
}); 

對於第二個,事情比較複雜,無法通過方法來實現,除非你手動刷新的結果不時。

首先,你的應用程序需要通知文件結構發生變化時。爲此,您需要一個包來監視文件系統,而不僅僅是瀏覽現有的文件。 chokidar是一個選擇的工具。

現在的問題是,當文件系統已更改,您收到一個事件,該方法已很久以前回來了,忘記了,所以你不能用它來傳播事件給客戶端。你需要一個不同的工具。我可以想到三種可能性。

  • 標準之一是在服務器上創建自定義發佈並訂閱它。這是最好的解決方案,但不是最簡單的解決方案。請參閱documentation中的示例。

  • 一個簡單的解決方法是將文件結構複製到蒙戈數據庫收集和簡單的訂閱的集合。這可能是簡單項目的最簡單選擇。

  • 您還可以使用類似anit:methods這樣的軟件包來通知客戶端該事件,儘管使用此解決方案您不會獲得反應性,您需要在客戶端手動管理依賴關係。

相關問題