Node.JS - fs.exists不工作?

时间:2013-03-24 20:23:55

标签: 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'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_file'是否存在之后的部分,我似乎无法使代码在以下内容中正常工作:if(exists){... NOT WORKING } 我尝试注销该部分中所有变量的值,并且它们具有预期值,但是行c[action].apply(global.info.action, global.info.params); 未按预期运行。它应该调用controller_file中的一个函数,并且应该做一个简单的res.write('hello world');。在我开始使用fs.exists检查文件之前,我没有遇到此问题。 if语句中的所有内容在此检查之前都完美无缺。

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

谢谢

1 个答案:

答案 0 :(得分:4)

与其他人评论过一样,我建议你重写代码以使其更符合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');

现在,您可以使用app/controllers/test.js访问controllers.test模块。所以,而不是:

fs.exists(controllerFile, function (exists) {
    if (exists) {
        ...
    }
});

简单地:

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

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