2014-11-23 44 views
1

爲了學習node js我做了一些練習,但遇到了問題,「res」變量在index.js中工作,但在fs.exists函數中不起作用,爲什麼?。感謝您的迴應。node.js res.write不起作用

server.js

var http = require("http"); 
global.PATH = __dirname; 

http.createServer(function(req, res) { 


    var app = require("./index.js")(req, res); 

    res.end(); 

}).listen(8080); 

index.js

var url = require("url"); 
var fs = require("fs"); 

module.exports = function(req, res){ 


    if(req){ 

     var pathname = url.parse(req.url).pathname.split("/"); 
     pathname.splice(0,1); 
     var action = pathname[1]; 


     fs.exists(PATH + "/" + pathname[0] + ".js" , function(exist){ 

      var controller; 
      res.write('doesn\'t work'); 

      if(exist) 
      { 
       if(!controller){ 
        controller = require(PATH + "/controllers/" + pathname[0] + ".js")(); 

        if(controller[action]) 
         controller[action](); 
       } 
      } 
     }); 
    } 
} 
+0

'需要()'是同步的,所以我不建議你在每個使用它請求。首先緩存它,然後調用你需要的文件。 – Seth 2014-11-23 00:48:40

回答

3

我不知道爲什麼有些人downvoted的問題,因爲對於一個初學者一些異步模式可以是混亂...

首先你應該緩存你的require-call(如Seth提到的)。

global.PATH = __dirname; 
var http = require("http"); 
var app = require("./index"); //omit .js, you don't need it 

那麼你你index.js你使用fs.exists,這是異步的。這意味着在達到fs.exists內的回調函數之前調用res.end(),這意味着請求/響應生命週期結束。

您可以使用fs.existsSync(不推薦!)或提供一些回撥,您在完成時調用!

2件更多的事情

  1. if(req)是不必要的,總有一個請求對象!
  2. 您總是需要在您的功能中調用回調,以使響應被髮送!

server.js:

http.createServer(function(req, res) { 

    app(req, res, function() { 
     res.end(); 
    }); 

}).listen(8080); 

index.js:

var url = require("url"); 
var fs = require("fs"); 

module.exports = function(req, res, cb) { // see third cb-argument! 


    var pathname = url.parse(req.url).pathname.split("/"); 
    pathname.splice(0,1); 
    var action = pathname[1]; 


    fs.exists(PATH + "/" + pathname[0] + ".js" , function(exist){ 

     var controller; 
     res.write('doesn\'t work'); 

     if(exist) 
     { 
      if(!controller){ 
       controller = require(PATH + "/controllers/" + pathname[0] + ".js")(); 

       if(controller[action]) 
        controller[action](); 
      } 
     } 
     cb(); // whenever you're done call the callback 
    }); 
} 
+0

謝謝你的迴應,我明白了,它太愚蠢了,而且我知道fs.exists是異步的。 – unoomad 2014-11-23 01:12:17