2

我正在玩弄使用 Meteor 作为后端来创建静态 html 生成器(带有管理 UI)的想法。

我希望,当触发时,将在公用文件夹上创建一个新文件,并立即由作者在嵌入 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;
    }
  });
}
4

1 回答 1

2

我认为每当您更改流星子目录中的任何文件时,流星服务器都会重新启动。因此,为防止这种情况,请不要将文件写入流星应用程序目录中,将 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 可以正常工作。但任何一种方式都可能有效)。

希望有帮助。祝你好运,我认为流星是这类事情的一个很好的框架。我使用的大多数管理界面仍然是完全同步的,而且使用起来很烦人。

于 2012-04-29T17:20:27.793 回答