我正在考虑使用 Meteor 作为后端来创建静态 html 生成器(带有管理 UI)。
我希望在触发时,将在公共(public)文件夹上创建一个新文件,并立即由作者在嵌入 html 的 iframe 上进行审阅。
文件被创建,但发生了两个副作用:
- 服务器已重新启动。
- 该文件已缓存 - 因此用户无法看到发生了更改。
有什么想法吗?
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;
}
});
}
最佳答案
我认为只要您更改 meteor 子目录中的任何文件, meteor 服务器就会重新启动。因此,为了防止这种情况发生,请不要在 Meteor 应用程序目录中写入文件,请将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 可以正常工作。但无论哪种方式都可能有效)。
希望有帮助。祝你好运,我认为 Meteor 是这类事情的一个很好的框架。我使用的大多数管理界面仍然完全同步,而且使用起来很烦人。
关于meteor - 动态添加文件到public文件夹并在meteor中获取刷新结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10360674/