返回值未定义(应为字符串)

时间:2013-04-01 11:22:12

标签: node.js

我刚开始使用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的特殊内容或其他东西?

1 个答案:

答案 0 :(得分: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);

希望这会有所帮助: - )。