2014-11-23 47 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