2014-11-23 6 views
1

노드 j를 배우려면 약간의 연습을했지만 문제가 발생했습니다. "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

답변

3

초보자를위한 몇 가지 비동기 패턴이 혼란 스러울 수 있기 때문에 당신의 일부는 질문을 downvoted 내가 왜 몰라요 ...

먼저 Seth가 언급 한 것처럼 요구 통화를 캐시해야합니다.

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

당신은 비동기적인 fs.exists를 사용하고 있습니다. 즉, res.end()fs.exists에 콜백 함수가 도달하기 전에 호출됩니다. 즉, 요청/응답 lifecylcle이 끝났음을 의미합니다.

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

관련 문제