我想创建一个node.js函数,当调用时,它会读取文件并返回内容。我这样做有困难,因为'fs'被解雇了。因此,我的功能必须如下所示:
function render_this() {
fs.readFile('sourcefile', 'binary', function(e, content) {
if(e) throw e;
// I have the content here, but how do I tell people?
});
return /* oh no I can't access the contents! */;
};
我知道可能有一种方法可以使用非事件IO进行此操作,但我更喜欢一个允许我等待事件函数的答案,这样如果我遇到一个情况,我就不会再次陷入困境我需要做同样的事情,但不是IO。我知道这打破了“一切都是好事”的想法,而且我不打算经常使用它。但是,有时我需要一个实用功能,可以动态呈现haml模板。
最后,我知道我可以调用fs.readFile并尽早缓存结果,但这不起作用,因为在这种情况下'sourcefile'可能会动态更改。
答案 0 :(得分:4)
好的,所以你想让你的开发版本在每次更改时自动加载和重新呈现文件,对吗?
您可以使用fs.watchFile
来监控文件,然后在每次更改时重新呈现模板,我想您已经有了某种全局变量,其中说明服务器是在dev中运行还是生产方式:
var fs = require('fs');
var http = require('http');
var DEV_MODE = true;
// Let's encapsulate all the nasty bits!
function cachedRenderer(file, render, refresh) {
var cachedData = null;
function cache() {
fs.readFile(file, function(e, data) {
if (e) {
throw e;
}
cachedData = render(data);
});
// Watch the file if, needed and re-render + cache it whenever it changes
// you may also move cachedRenderer into a different file and then use a global config option instead of the refresh parameter
if (refresh) {
fs.watchFile(file, {'persistent': true, 'interval': 100}, function() {
cache();
});
refresh = false;
}
}
// simple getter
this.getData = function() {
return cachedData;
}
// initial cache
cache();
}
var ham = new cachedRenderer('foo.haml',
// supply your custom render function here
function(data) {
return 'RENDER' + data + 'RENDER';
},
DEV_MODE
);
// start server
http.createServer(function(req, res) {
res.writeHead(200);
res.end(ham.getData());
}).listen(8000);
创建一个cachedRenderer
,然后在需要时访问它的getData
属性,如果你处于开发模式,它会在每次更改时自动重新呈现文件。
答案 1 :(得分:0)
function render_this( cb ) {
fs.readFile('sourcefile', 'binary', function(e, content) {
if(e) throw e;
cb( content );
});
};
render_this(function( content ) {
// tell people here
});