我刚刚开始使用 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
。我认为异步发生了一些事情.. 发生了获取请求,当它发生时,我尝试打印尚未收到的结果?我想我需要让它同步还是什么?
非常感谢。
最佳答案
如果您查看 getBar,它不会返回任何内容。这就是为什么你变得不确定。要获得结果,您必须向 getBar 发送回调:
getBar = function (callback){...
并在结束时调用回调函数:
res.on('end, function(){
callback(foo);
});
此外,我建议您将 foo 放在 getBar 的闭包中,以防您同时执行多个请求。同样,您应该只连接数据 block 并在最后解析它,以防响应对于一个 block 来说太长。
最后你的代码应该是这样的:
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);
});
关于javascript - 发出 http.request 返回 undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16415411/