Node.JS-fs.exists不工作?

Node.JS-fs.exists不工作?,node.js,asynchronous,if-statement,Node.js,Asynchronous,If Statement,我是Node.js的初学者,在使用这段代码时遇到了问题 var fs = require('fs'); Framework.Router = function() { this.run = function(req, res) { fs.exists(global.info.controller_file, function(exists) { if (exists) { // Here'

我是Node.js的初学者,在使用这段代码时遇到了问题

var fs = require('fs');

Framework.Router = function() {

    this.run = function(req, res) {
        fs.exists(global.info.controller_file, function(exists) {
            if (exists) {
                            // Here's the problem
                            res.writeHead(200, {'Content-Type':'text/html'});
                var cname = App.ucfirst(global.info.controller)+'Controller';
                var c = require(global.info.controller_file);
                var c = new App[cname]();
                var action = global.info.action;
                c[action].apply(global.info.action, global.info.params);
                            res.end();
            } else {
                App.notFound();
                return false;
            }
        });
    }
};
问题在于检查“global.info.controller_文件”是否存在后的部分,我似乎无法使代码在:if(exists){…中正常工作} 我尝试注销该部分中所有变量的值,它们都有预期的值,但是行:
c[action].apply(global.info.action,global.info.params);
未按预期运行。它应该调用controller_文件中的函数,并且应该执行一个简单的
res.write('hello world')。在开始使用
fs.exists
检查文件之前,我没有遇到这个问题if语句中的所有内容在此检查之前都运行良好。

为什么代码没有按预期运行?为什么请求只是超时? 它是否与整个同步与异步的事情有关?(对不起,我完全是初学者)


谢谢

像其他人评论的那样,我建议您重写代码,使其更符合Node.js设计模式,然后看看您的问题是否仍然存在。同时,以下几点可能会有所帮助:

关于不要在“运行时”动态使用
require
的建议应该得到注意,并且在每个请求上调用
fs.exists()
是非常浪费的。但是,假设您希望加载目录(可能是“控制器”目录)中的所有*.js文件。这最好使用index.js文件来完成

例如,将以下内容另存为
app/controllers/index.js

var fs = require('fs');
var files = fs.readdirSync(__dirname);
var dotJs = /\.js$/;
for (var i in files) {
    if (files[i] !== 'index.js' && dotJs.test(files[i]))
        exports[files[i].replace(dotJs, '')] = require('./' + files[i]);
}
然后,在app/router.js的开头添加:

var controllers = require('./controllers');
现在,您可以使用
controllers.test
访问
app/controllers/test.js
模块。因此,不是:

fs.exists(controllerFile, function (exists) {
    if (exists) {
        ...
    }
});
简单地说:

if (controllers[controllerName]) {
    ...
}

通过这种方式,您可以保留所需的动态功能,而不需要不必要的磁盘IO。

就像其他人评论的那样,我建议您重新编写代码,使其与Node.js设计模式更加一致,然后查看您的问题是否仍然存在。同时,以下几点可能会有所帮助:

关于不要在“运行时”动态使用
require
的建议应该得到注意,并且在每个请求上调用
fs.exists()
是非常浪费的。但是,假设您希望加载目录(可能是“控制器”目录)中的所有*.js文件。这最好使用index.js文件来完成

例如,将以下内容另存为
app/controllers/index.js

var fs = require('fs');
var files = fs.readdirSync(__dirname);
var dotJs = /\.js$/;
for (var i in files) {
    if (files[i] !== 'index.js' && dotJs.test(files[i]))
        exports[files[i].replace(dotJs, '')] = require('./' + files[i]);
}
然后,在app/router.js的开头添加:

var controllers = require('./controllers');
现在,您可以使用
controllers.test
访问
app/controllers/test.js
模块。因此,不是:

fs.exists(controllerFile, function (exists) {
    if (exists) {
        ...
    }
});
简单地说:

if (controllers[controllerName]) {
    ...
}

这样,您就可以保留所需的动态功能,而无需进行不必要的磁盘IO。

RED FLAG!require是阻塞IO的,不要在请求处理程序中使用它,动态使用它通常也不好。在启动时而不是运行时加载模块为什么分配
var c
两次?@loganfsmyth噢。。。“没有理由笑,但它不会改变任何事情。”亨利·奥曼将军,所以我应该用一种完全不同的方式来做这件事?因为我如何使用“require”函数而不知道我试图请求的文件是否存在?请求超时通常意味着没有响应被发送。可能是您试图重用旧的响应对象吗?因为我没有看到你在任何地方使用当前的
res
对象。红旗!require是阻塞IO的,不要在请求处理程序中使用它,动态使用它通常也不好。在启动时而不是运行时加载模块为什么分配
var c
两次?@loganfsmyth噢。。。“没有理由笑,但它不会改变任何事情。”亨利·奥曼将军,所以我应该用一种完全不同的方式来做这件事?因为我如何使用“require”函数而不知道我试图请求的文件是否存在?请求超时通常意味着没有响应被发送。可能是您试图重用旧的响应对象吗?因为我没有看到您在任何地方使用当前的
res
对象。