2017-02-22 109 views
1

我有路徑模塊的這個問題。當我嘗試使用「path.join ......」請求處理程序中,我得到錯誤信息節點JS要求('路徑')

TypeError: Cannot read property 'join' of undefined

不過,我可以通過加載requestHandler的身體內的模塊修復它(我評論它在代碼中)。

您能否解釋爲什麼它會失敗,爲什麼「修復」起作用,以及處理此問題的最常用方法是什麼?

var http = require('http'); 
 
var url = require('url'); 
 
var path = require('path'); 
 
var fs = require('fs'); 
 

 
var port = 3000; 
 

 
var requestHandler = (request, response) => { 
 
    //path = require('path'); 
 
    var uri = url.parse(request.url).pathname; 
 
    
 
    
 
    var filename = path.join(process.cwd(), uri); 
 
    
 
    var path = process.cwd(); 
 
    var buffer = fs.readFileSync(path + "/someSite.html"); 
 
    response.end(buffer); 
 

 
}; 
 

 
var server = http.createServer(requestHandler); 
 

 
server.listen(port, (err) => { 
 
    if (err) { 
 
    return console.log('sum ting wong', err); 
 
    } 
 
    console.log('server is listening on ${port}'); 
 
});

回答

5

因爲你重新分配到path您的請求處理程序內部W/var path = process.cwd()它打破。

的VAR聲明爲hoisted,這意味着你的實現是等價於:

var requestHandler = (request, response) => { 
    var path; // hoisted! 
    var uri = url.parse(request.url).pathname; 

    var filename = path.join(process.cwd(), uri); 

    path = process.cwd(); 
    // ... 
}; 
+1

您所提供的鏈接給我的答案; 「在任何代碼執行之前處理變量聲明」。 我明白你爲什麼這麼說是相當的!謝謝! – Fredrik