Node.JS – fs.exists不工作?
我是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 }我试着注销值的所有variables在该部分,他们有他们的期望值,但行: c[action].apply(global.info.action, global.info.params);
没有按预期运行。 它应该在controller_file中调用一个函数,并应该做一个简单的res.write('hello world');
。 在我开始使用fs.exists
检查文件之前,我没有遇到这个问题。 if语句中的所有内容,在检查之前都工作得很好。
为什么代码没有按预期运行? 为什么要求超时? 它与整个同步与asynchronous的事情有关吗? (对不起,我是一个完整的初学者)
谢谢
像其他人一样,我build议你重写你的代码,使它更符合Node.jsdevise模式,然后看看你的问题是否还存在。 在此期间,这可能有所帮助:
应该注意关于不在“运行时间”dynamic使用的build议,每个请求调用fs.exists()
都是非常浪费的。 但是,假设您想要将所有的* .js文件加载到一个目录中(也许是一个“controllers”目录)。 这最好使用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
来访问app/controllers/test.js
模块。 所以,而不是:
fs.exists(controllerFile, function (exists) { if (exists) { ... } });
只是:
if (controllers[controllerName]) { ... }
这样,您可以保留您所需的dynamicfunction,而无需使用不必要的磁盘IO。