我有这段简单的代码:
var http = require('http'), fs = require("fs");
function get(p) {
fs.readFile('.' + p,'utf8', function (err, cont) {
if (err) return "EERRRORRRRR";
else return cont;
})
}
http.createServer(function (request, response) {
var path = ((request.url==="/")?"/index.html":request.url);
console.log(get(path));
}).listen(80);
当我运行并连接到服务器时,它会记录未定义...
当我添加“console.log(cont)”时,如:
fs.readFile('.' + p,'utf8', function (err, cont) {
console.log(html)
if (err) return "EERRRORRRRR";
else return cont;
})
它记录了正确的内容,为什么函数返回undefined?内容存在......
我该如何解决这个问题?
如果您无法分辨,代码的原始上下文是一个简单的Web服务器。
答案 0 :(得分:1)
了解回调和异步功能,您可以在谷歌中找到文档
var http = require('http'),
fs = require("fs");
// notice new parameter callback
function get(p, callback) {
fs.readFile('.' + p,'utf8', callback);
}
http.createServer(function (request, response) {
var path = ((request.url==="/")?"/index.html":request.url);
// get accepts callback
get(path, function(err, data){
if(err){
response.send('not found');
} else {
response.send(data);
}
});
}).listen(80); // notice: port 80 requires sudo to run, use better 3000
答案 1 :(得分:0)
readFile
是异步的(以及几乎所有其他函数)。您无法从异步函数返回值,而是需要使用将在操作结束后调用的回调函数:
fs.readFile('.' + p,'utf8', function (err, cont) {
console.log(html)
if (err) return "EERRRORRRRR";
else handleResponse(cont);
})
function handleResponse(data){//Do something here}
答案 2 :(得分:0)
如果您想在不使用回叫的情况下返回某些内容,请使用readFileSync。
function get(p) {
var file = fs.readFileSync('.' + p,'utf8');
return file ? file : "EERRRORRRRR";
}
这假设您不介意使用同步/阻止代码。