2017-02-22 10 views
1

私はこの問題をパスモジュールに持っています。私は、リクエストハンドラ内で「... path.join」を使用しようとすると、私はエラーメッセージが表示されますノードJS require( 'path')

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

あなたが/ var path = process.cwd()ワットリクエストハンドラ内pathに再割り当てしているので、それが壊れています。

の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