从NodeJS中的http请求获取JSON

时间:2014-12-24 03:36:19

标签: javascript json node.js http asynchronous

我无法使用Node.JS从HTTP GET请求返回JSON。

通过示例和文档阅读,这是我提出的:

var http = require('http');

var options = {
    host: 'some.host.com',
    path: '/some/path'
};

var callback = function(response) {
    var raw = '';
    response.on('data', function(d) {
    raw += d;
    });
    response.on('end', function() {
    var data = JSON.parse(raw);
    });
    return data;
};

http.request(options, callback).end()

我还尝试从data范围内返回response.on而没有任何运气。请注意,使用CURL,我可以毫无问题地获取数据。

我做错了什么以及如何修复上述代码以获取JSON?

1 个答案:

答案 0 :(得分:2)

永远不会从回调中返回值。

如果在回调中获得值,则需要使用另一个回调来提取值或在现场使用它:您无法返回它。问题永远是"好吧,现在我有这些数据,我想用它做什么?"答案"归还"是不可接受的。

例如,这应该有效:

var http = require('http');

var options = {
    host: 'some.host.com',
    path: '/some/path'
};

var useData = function(data) {
    // do something
}

var callback = function(response) {
    var raw = '';
    response.on('data', function(d) {
        raw += d;
    });
    response.on('end', function() {
        var data = JSON.parse(raw);
        useData(data);
    });
};

http.request(options, callback).end()

(另外,不是您的主要问题,但您有两个名为data的变量:var data行中的一个本地行,return行中的另一个全局变量。)

修改

  

我很困惑为什么我不能"返回"来自回调的值。 Don函数有返回值/变量,还是计算值?

他们这样做,但为时已晚。比喻时间。

<强>同步

玛莎告诉约翰接听电话,然后耐心地等待谈话结束。然后她问他是谁以及他们想要什么。约翰说他们的邻居正在要一杯糖。她告诉他去给邻居一杯糖。然后,她出去见她的朋友。

var reply = john.answerPhone();
var action = reply.figureOutResponse();
john.tellToDo(action);

错误的异步:

玛莎告诉约翰接电话,告诉她这是什么,然后出去见她的朋友。当她离开家时,她试图按照约翰的声音处理答复 - 但约翰甚至没有拿起接收器,更不用说告诉她什么了 - 所以她神经衰弱了。如果她试图阅读这张纸条,它仍然是一张白纸(即使我们忽略了它可能还在房子里的事实),所以她还有另一个故障。如果有人还在乎,五分钟后约翰挂断电话,并宣布他的邻居需要糖到空房子,因为玛莎不再在那里了。为了以防万一,他还给她写了一张便条。没有人告诉他还有什么可做,他拿起报纸开始浪费时间。该笔记永远不会被阅读。

var note;
var reply = john.answerPhone(function(reply) {
    note = reply;
    return reply;
};
note.figureOutResponse();
// Cannot read property 'figureOutResponse' of undefined
reply.figureOutResponse();
// Cannot read property 'figureOutResponse' of undefined

纠正异步:

玛莎告诉约翰接电话,然后打电话给她,因为她必须出去和朋友见面。她出去了,约翰拿起电话。五分钟后,约翰打电话给玛莎的手机说这是一个寻找糖的邻居。她告诉他要把杯子装满并送给邻居,然后挂起来继续乘坐公共汽车。

var marthasCellphone = function(data, respondCallback) {
    var action = data.figureOutResponse();
    respondCallback(action);
}
john.answerPhone(function(data) {
    // callback here: no returns, pass data on to another callback
    var action = marthasCellphone(data, function(action) {
        // another callback here; use action immediately
        john.tellToDo(action);
    });        
});
reply.figureOutResponse();