如何在服务器上使用npm时使方法成为被动的

我需要将目录中的文件列表传送给Meteor中的客户端。

到目前为止,我有这样的:

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之前调用方法,只是返回方法中创build的空数组。

我的问题是,我如何使这种反应? 我想要每次在目录中添加或删除文件时都运行此方法。

你需要做两件事来实现你的目标。

1)使Meteor方法等待asynchronous结果,

2)当文件结构发生变化时,更新结果。

第一个是相对容易的,通常用期货来实现。 看这个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是一个select的工具。

现在的问题是,当文件系统发生了变化,并且你收到一个事件时,这个方法很久以前就已经返回了,并且被遗忘了,所以你不能用它来传播事件给客户端。 你需要一个不同的工具。 我可以想到三种可能性。

  • 标准的一个是在服务器上创build一个自定义发布并订阅它。 这是最好的解决scheme,但不是最简单的解决scheme。 请参阅文档中的示例。

  • 一个简单的解决方法是将文件结构复制到Mongo数据库中的集合,并简单地订阅该集合。 这可能是简单项目的最简单的select。

  • 您也可以使用类似anit:方法的包来通知客户端事件,但是使用此解决scheme时,您将无法获得react native – 您将需要在客户端手动pipe理依赖项。