2

我是 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 语句中的所有内容在此检查之前都运行良好。

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

谢谢

4

1 回答 1

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。

于 2013-03-31T07:17:36.080 回答