2013-04-01 34 views
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。 所以我做了這樣的事情:(不要理會的compileJadeFile未使用的參數,它原來是用我只是縮短它在這個例子中)

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

現在,如果我登錄的compileJadeFile("index.jade")到控制檯,它說"undefined" :(

結果我搜索谷歌對於這一點,但我沒有發現任何解決問題。 你們誰能幫助我嗎?我已經習慣了的代碼在C#或C++,所以也許我錯過了某些東西或對Java很特別的東西CRIPT?

回答

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); 

希望這有助於:-)。

+0

是的,它工作正常:)謝謝:)現在我明白這個異步的東西好一點^^ – TorbenJ

+0

偉大的:-)!對Node.js有很多樂趣:-)! –

相關問題