【问题标题】:Reading Files Asynchronously on Meteor在 Meteor 上异步读取文件
【发布时间】:2015-01-25 13:14:13
【问题描述】:

我对 Meteor 很陌生,所以如果这是一个愚蠢的问题,我很抱歉:

如何从服务器端的文件系统中读取文件,并在客户端显示这些内容。同步执行不是问题,因为我可以立即返回它,但据我了解,这违背了 Meteor 的目的,所以我试图异步执行它。但是我不知道如何以这种方式连接客户端/服务器。发布/订阅似乎只适用于数据库集合而不是文件系统文件。非常感谢您能给我的任何指导。

if (Meteor.isClient) {
Template.body.helpers({
            myfile: function(){
                    return file_contents;
            }
    });
}


if (Meteor.isServer) {
     Meteor.methods({
     myfile: function(){
                    var fs = Npm.require("fs");
                    fs.readFile('/opt/SI/SIAgent/conf/myfile','utf-8', function (err, data) {
                    file_contents =  data;
                    });

             }   
     });

}

【问题讨论】:

  • 我想你想研究 Meteor Methods。 docs.meteor.com/#/full/methods_header
  • 我可以调用服务器方法,但不知道如何异步取回数据。基本上 id 喜欢用文件的当前内容更新页面。

标签: asynchronous meteor


【解决方案1】:

您必须使用 Meteor.wrapAsync 将 Node.JS fs.readFile 转换为看起来同步的代码,以便您可以在 Meteor 方法中返回结果。

var fs=Npm.require("fs");
fsReadFileSync=Meteor.wrapAsync(fs.readFile,fs);

Meteor.methods({
  getMyFileContent:function(){
    return fsReadFileSync("/opt/SI/SIAgent/conf/myfile","utf-8");
  }
});

【讨论】:

  • 或者你可以使用fs.readFileSync :)
  • fs.readFileSync 的问题在于它是真正同步的,并且会阻塞 Node 事件循环,这与 Fiber 的同步性相反,它只会使异步调用看起来像使用语法糖的同步代码。 fs.readFileSync 确实是您只想在基于节点的 CLI 中使用的东西。
  • 好点!我想我应该想到这一点......我们目前在我们的代码库中没有任何包装函数,所以这不是我之前考虑过的问题。谢谢提醒。
猜你喜欢
  • 2017-01-13
  • 2018-11-13
  • 1970-01-01
  • 2019-05-02
  • 2019-02-20
  • 2021-08-07
  • 2019-01-13
  • 2012-12-07
  • 1970-01-01
相关资源
最近更新 更多