我是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异步事件有关? (对不起,我是一个完全的初学者)
谢谢
答案 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。