Node.js返回文件的结果

时间:2010-10-07 00:38:54

标签: javascript node.js

我想创建一个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'可能会动态更改。

2 个答案:

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