node.js res.write不起作用

时间:2014-11-23 00:14:10

标签: javascript node.js

要学习节点js我做了一些练习但是遇到了问题," res" index.js中的变量工作但在fs.exists函数中不起作用,为什么?谢谢你的回复。

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]();
                 }
            }
        });
    }
}

1 个答案:

答案 0 :(得分:3)

我不知道为什么有些人会对这个问题进行讨论,因为对于初学者来说,一些异步模式可能会令人困惑......

首先,您应该缓存您的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,这是异步的。这意味着,在res.end()内的回调函数到达之前调用fs.exists,这意味着请求/响应生命周期结束。

您可以使用fs.existsSync(不推荐!)或提供一些您完成后调用的回调!

另外两件事

  1. if(req)是不必要的,总有一个请求对象!
  2. 您总是需要在函数中调用回调函数,以便发送响应!
  3. <强> 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
        });
    }