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。