2

我刚开始用 NodeJS 开发一些东西,遇到了一个非常令人沮丧的错误。

我有一个将 .jade 编译为 .html 的功能

function compileJadeFile(jadeFile){
    var pathToFile = "./index.jade";

    fs.exists(pathToFile, function(exists){
        if(exists){
            fs.readFile(pathToFile, function(err, data){
                                    var html = jade.compile(data)();
                                    return html;
            });
        }
    });
}

一切正常,但现在我想提供已编译的 html。所以我做了这样的事情:

res.write(compileJadeFile("index.jade"));

(不用担心 的未使用参数compileJadeFile,它在原始中使用。我只是为这个例子缩短了它)

现在,如果我将结果记录compileJadeFile("index.jade")到控制台,它会说"undefined":(

我在谷歌上搜索了这个,但我没有找到任何解决问题的方法。你们中的任何人都可以帮助我吗?我习惯用 C# 或 C++ 编写代码,所以也许我遗漏了一些对 Javascript 来说特别的东西或东西?

4

1 回答 1

4

您的代码是同步的,但您使用的代码是异步的。问题是当你调用你的compileJadeFile函数时它实际上并没有返回任何东西,因此它的返回值是按定义的undefined

您还需要使函数本身异步,并引入回调并将您的方法更改为:

function compileJadeFile(jadeFile, callback) {
  var pathToFile = "./index.jade";

  fs.exists(pathToFile, function(exists) {
    if(exists){
      fs.readFile(pathToFile, function(err, data) {
        var html = jade.compile(data)();
        callback(html);
      });
    }
  });
}

然后你可以像这样使用它:

compileJadeFile("index.jade", function (html) {
  res.write(html);
  res.end();
});

请注意,对于完全符合 Node.js 的回调,回调始终应err作为其第一个参数来传输错误。因此,理想情况下,您的代码应该是:

compileJadeFile("index.jade", function (err, html) {
  if (err) { throw err; }
  res.write(html);
  res.end();
});

然后,当然你需要将回调的调用更改为:

callback(null, html);

希望这可以帮助 :-)。

于 2013-04-01T11:25:22.907 回答