我刚开始使用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的特殊内容或其他东西?
答案 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);
希望这会有所帮助: - )。