使一个http.request返回未定义

我刚刚开始使用Node.js。 我有一个关于http.request的基本问题。 我想用一些函数编写一个JavaScript模块,从一些服务器返回一些数据。

代码如下:

var mod = (function() { var my = {}; var options = { hostname: 'example.com' }; var foo = ''; my.getBar = function() { var req = http.request(options, function(res) { res.setEncoding('utf8'); res.on('data', function (chunk) { // example.com returns JSON // TODO need to be able to get foo from outside this module foo = JSON.parse(chunk).bar; }); }); req.end(); } return my; }()); 

要得到bar我这样做:

 console.log(mod.getBar()); 

但我undefined 。 我认为asynchronous的事情正在发生..得到请求发生,当它发生时,我试图打印尚未收到的结果呢? 我想我需要使它同步或什么?

非常感谢。

如果你看看getBar,它不会返回任何东西。 这就是为什么你没有定义。 为了得到结果,你必须发送一个callbackgetBar:

 getBar = function (callback){... 

并用结果调用callback结束:

 res.on('end, function(){ callback(foo); }); 

另外我build议你把foo放在getBar的闭包里,以防你同时做多个请求。 同样,你应该只是连接数据块并parsing它,以防一个块的响应太长。

最后你的代码应该看起来像这样:

 var mod = (function() { var my = {}; var options = { hostname: 'example.com' }; my.getBar = function(callback) { var foo = ''; var req = http.request(options, function(res) { res.setEncoding('utf8'); res.on('data', function (chunk) { foo += chunk; }); res.on('end', function () { callback(null, JSON.parse(foo).bar); // The null is just to adhere to the de facto standard of supplying an error as first argument }); }); req.end(); } return my; }()); 

得到像这样的酒吧:

 mod.getBar(function(err, data) { console.log(data); }); 

你的函数mod.getBar()没有return语句,所以返回undefined是很自然的。

另一方面,如果你想让console.log()res.on()事件写出foovariables的内容,你必须直接在该函数中执行,因为mod.getBar()函数只附加事件听了mod