为了学习节点js,我做了一些练习,但遇到了问题,"res"变量在索引中工作.js但在fs.exist函数中不起作用,为什么?感谢您的回复。
服务器.js
var http = require("http");
global.PATH = __dirname;
http.createServer(function(req, res) {
var app = require("./index.js")(req, res);
res.end();
}).listen(8080);
索引.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]();
}
}
});
}
}
我不知道
为什么你们中的一些人对这个问题投了反对票,因为对于初学者来说,一些异步模式可能会令人困惑......
首先,你应该缓存你的require-call(正如Seth提到的)。
global.PATH = __dirname;
var http = require("http");
var app = require("./index"); //omit .js, you don't need it
然后你索引.js你正在使用 fs.exists,它是异步的。 这意味着,在到达 fs.exists
内部的回调函数之前调用res.end()
,这意味着请求/响应生命周期结束。
你可以使用 fs.existsSync(不推荐!)或提供一些回调,完成后调用!
还有 2 件事
if(req)
是不必要的,总有一个请求对象!- 你总是需要在函数中调用回调,使响应被发送!
服务器.js:
http.createServer(function(req, res) {
app(req, res, function () {
res.end();
});
}).listen(8080);
索引.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
});
}