javascript - 发出 http.request 返回 undefined

标签 javascript node.js

我刚刚开始使用 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/

相关文章:

javascript - 2 个日期之间的日期列表(从 -> 到)

javascript - 如何将数据绑定(bind)到 Kendo 网格客户端模板中的 Kendo 下拉列表?

javascript - 更改 Firefox 中报告的屏幕分辨率

node.js - 是否可以用 C(不是 C++)编写 node.js 扩展?

node.js - 在 NodeJS 上的 Firestore 中获取集合中的所有数据

javascript - mysql/node.js 如何使/假同步?

javascript - HTML 包含 js 文件

javascript - 如何在特定类(class)之前选择 previous sibling 姐妹?

javascript - Web 服务可以不支持 JSONP 吗?

arrays - 如何从 Mongoose 数组中获取数据?