从NodeJS中的http请求获取JSON

CodeKingPlusPlus

我无法使用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?

阿玛丹

永远无法从回调中返回值。

如果在回调中获得值,则需要使用另一个回调来提取值或当场使用它:您无法返回它。问题始终是“现在我有了这些数据,我要怎么处理?” 并且“返回它”的答案是不可接受的。

例如,这应该工作:

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。)

编辑:

我很困惑为什么我不能从回调中“返回”一个值。函数是否没有返回值/变量,或者没有求值?

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

同步:

Martha告诉John接电话,然后耐心等待对话结束。然后她问他是谁,他们想要什么。约翰说,他们的邻居要一杯糖。她告诉他去给邻居喝杯糖。然后,她出去见她的朋友们。

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

正确的异步:

玛莎(Martha)告诉约翰(John)接电话,并用信息给她回电,因为她必须外出与朋友见面。她出去了,约翰接了电话。五分钟后,约翰打电话给玛莎的手机,说是邻居在找糖。她告诉他加满一个杯子,然后送给邻居,然后挂断电话,继续她的公车旅行。

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();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章