Node.js res.write 不起作用



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

服务器.js

var http = require("http");
global.PATH = __dirname;
http.createServer(function(req, res) {

    var app = require("./index.js")(req, res);
    res.end();
}).listen(8080);

索引.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]();
                 }
            }
        });
    }
}
我不知道

为什么你们中的一些人对这个问题投了反对票,因为对于初学者来说,一些异步模式可能会令人困惑......

首先,你应该缓存你的require-call(正如Seth提到的)。

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

然后你索引.js你正在使用 fs.exists,它是异步的。 这意味着,在到达 fs.exists 内部的回调函数之前调用res.end(),这意味着请求/响应生命周期结束。

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

还有 2 件事

  1. if(req)是不必要的,总有一个请求对象!
  2. 你总是需要在函数中调用回调,使响应被发送!

服务器.js:

http.createServer(function(req, res) {
    app(req, res, function () {
      res.end();
    });
}).listen(8080); 

索引.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
    });
}

最新更新