动态地将文件添加到公用文件夹并在刷新中获取刷新的结果

时间:2012-04-28 04:47:51

标签: meteor

我正在尝试使用Meteor作为后端来创建静态html生成器(使用管理UI)。

我想要的是,当触发时,会在公用文件夹上创建一个新文件,并立即由作者在嵌入在html中的iframe进行审核。

文件已创建,但会发生两种副作用:

  1. 服务器重新启动。
  2. 文件已缓存 - 因此用户无法看到更改发生。
  3. 有什么想法吗?

    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;
        }
      });
    }
    

1 个答案:

答案 0 :(得分:2)

我认为只要你更改meteor子目录中的任何文件,meteor服务器就会重启。因此,为了防止这种情况,请不要在meteor app目录中编写文件,将created_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可以正常工作。但无论哪种方式都可行)。

希望有所帮助。祝你好运,我认为流星是这种事情的一个很好的框架。我使用的大多数管理界面仍然完全同步,只是讨厌使用。