我刚刚开始使用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
。我认为发生异步的事情..获取请求发生了,当它发生时,我尝试打印尚未收到的结果?我想我需要让它同步或什么?
非常感谢。
答案 0 :(得分:3)
如果你看看getBar,它不会返回任何内容。这就是你未定义的原因。要获得结果,您必须向getBar发送回调:
getBar = function (callback){...
并使用结果调用回调:
res.on('end, function(){
callback(foo);
});
另外我建议你把foo放在getBar的闭包中,以防你同时做多个请求。同样地,你应该只是连接数据上的块并在最后解析它,以防一个块的响应太长。
最后,您的代码应如下所示:
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);
});
答案 1 :(得分:0)
您的函数mod.getBar()
中没有返回语句,因此返回undefined
是很自然的。
另一方面,如果您希望console.log()
从res.on()
事件中写出 foo 变量的内容,则必须直接在该函数中执行此操作,因为mod.getBar()
函数仅附加侦听mod
的事件。