Javascript node.js res.write不';行不通

Javascript node.js res.write不';行不通,javascript,node.js,Javascript,Node.js,为了学习node 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();

为了学习node 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]();
                 }
            }
        });
    }
}

我不知道为什么你们中的一些人否决了这个问题,因为对于初学者来说,一些异步模式可能会令人困惑

首先,您应该缓存require调用(如Seth所述)

然后使用fs.exists创建index.js,这是异步的。这意味着在到达
fs.exists
中的回调函数之前调用
res.end()
,这意味着请求/响应生命周期结束

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

还有两件事

  • 如果(req)
    不是必需的,则始终存在一个请求对象
  • 您始终需要在函数中调用回调函数,才能发送响应 server.js:

    http.createServer(function(req, res) {
    
        app(req, res, function () {
          res.end();
        });
    
    }).listen(8080); 
    
    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
        });
    }
    
    index.js:

    http.createServer(function(req, res) {
    
        app(req, res, function () {
          res.end();
        });
    
    }).listen(8080); 
    
    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
        });
    }
    

    require()
    是同步的,所以我不建议您在每个请求中都使用它。首先缓存它,然后调用您需要的文件。感谢您的响应我理解,这太愚蠢了,而且我知道fs.exists是异步的。