要学习节点js我做了一些练习但是遇到了问题," res" index.js中的变量工作但在fs.exists函数中不起作用,为什么?谢谢你的回复。
server.js
var http = require("http");
global.PATH = __dirname;
http.createServer(function(req, res) {
var app = require("./index.js")(req, res);
res.end();
}).listen(8080);
index.js
var url = require("url");
var fs = require("fs");
module.exports = function(req, res){
if(req){
var pathname = url.parse(req.url).pathname.split("/");
pathname.splice(0,1);
var action = pathname[1];
fs.exists(PATH + "/" + pathname[0] + ".js" , function(exist){
var controller;
res.write('doesn\'t work');
if(exist)
{
if(!controller){
controller = require(PATH + "/controllers/" + pathname[0] + ".js" )();
if(controller[action])
controller[action]();
}
}
});
}
}
答案 0 :(得分:3)
我不知道为什么有些人会对这个问题进行讨论,因为对于初学者来说,一些异步模式可能会令人困惑......
首先,您应该缓存您的require-call(如Seth所提到的)。
global.PATH = __dirname;
var http = require("http");
var app = require("./index"); //omit .js, you don't need it
那么你是index.js你正在使用fs.exists,这是异步的。这意味着,在res.end()
内的回调函数到达之前调用fs.exists
,这意味着请求/响应生命周期结束。
您可以使用fs.existsSync(不推荐!)或提供一些您完成后调用的回调!
另外两件事
if(req)
是不必要的,总有一个请求对象!<强> server.js:强>
http.createServer(function(req, res) {
app(req, res, function () {
res.end();
});
}).listen(8080);
<强> index.js:强>
var url = require("url");
var fs = require("fs");
module.exports = function(req, res, cb) { // see third cb-argument!
var pathname = url.parse(req.url).pathname.split("/");
pathname.splice(0,1);
var action = pathname[1];
fs.exists(PATH + "/" + pathname[0] + ".js" , function(exist){
var controller;
res.write('doesn\'t work');
if(exist)
{
if(!controller){
controller = require(PATH + "/controllers/" + pathname[0] + ".js" )();
if(controller[action])
controller[action]();
}
}
cb(); // whenever you're done call the callback
});
}