【问题标题】:getting JSON from an http request in NodeJS从 NodeJS 中的 http 请求获取 JSON
【发布时间】:2015-02-22 05:32:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript json node.js http asynchronous


    【解决方案1】:

    您可以永远从回调中返回值。

    如果你在回调中得到一个值,你需要使用另一个回调来提取该值或当场使用它:你不能返回它。问题总是“好的,既然我有了这些数据,我想用它做什么?”而“退货”的答案是不可接受的。

    例如,这应该可以工作:

    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 中的另一个全局变量。)

    编辑:

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

    他们有,但为时已晚。类比时间。

    同步:

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

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

    【讨论】:

    • 我很困惑为什么我不能从回调中“返回”一个值。函数没有返回值/变量,或计算为一个值吗?
    • 另外,我主要只是想将 JSON 写入全局变量,以便在 REPL 中看到 JSON。
    • 谢谢,我想通了。
    猜你喜欢
    • 2013-07-22
    • 2017-03-12
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 2017-02-20
    • 2016-03-10
    • 1970-01-01
    相关资源
    最近更新 更多