【问题标题】:NodeJS + Socket.IO can't get json to returnNodeJS + Socket.IO 无法让 json 返回
【发布时间】:2013-10-05 14:42:38
【问题描述】:

我正在使用 Socket.IO、AngularJS、Request 和 Express,我试图从请求中提取一些数据,然后将其发送给客户端。这是我的功能:

    var getJsonFromJsonP = function (url, callback) {
        request(url, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                var jsonpData = body;
                var json;
                try {
                   json = JSON.parse(jsonpData);
                }
                catch(e) {
                    var startPos = jsonpData.indexOf('({');
                    var endPos = jsonpData.indexOf('})');
                    var jsonString = jsonpData.substring(startPos+1, endPos+1);
                    json = JSON.parse(jsonString);
                }
                callback(null, json);
            } else {
                callback(error);
            }
        })
    }

    var getScoring = function() {
        var url = 'http://live.nhle.com/GameData/RegularSeasonScoreboardv3.jsonp';
        var dataReturn;
        getJsonFromJsonP(url, function (err, data) {
            console.log(data);
            return data;
        });
    }

    io.sockets.on('connection', function(socket) {
        socket.emit('init', { data: getScoring() });
    });

getJsonFromJsonP 解决方案来自另一个帖子,它产生了良好的结果。

console.log(data) 在后端显示正确的数据,但客户端(AngularJS)没有得到它。如果我将return data 更改为return 'hello world',则“hello world”在客户端中显示为{ data : 'hello world' }

【问题讨论】:

  • return JSON.stringify(data); 是做什么的?

标签: node.js angularjs socket.io


【解决方案1】:

getScoring() 函数使用 getJsonFromJsonP(),它是异步的(因为它必须等待请求)。

因此,您可能还想传递getScoring() 一个回调函数,然后在该回调中发出事件。比如这样:

var getScoring = function(callback) {
    var url = 'http://live.nhle.com/GameData/RegularSeasonScoreboardv3.jsonp';
    var dataReturn;
    getJsonFromJsonP(url, function (err, data) {
        //pass data to callback function
        callback(data);
    });
}

io.sockets.on('connection', function(socket) {
    getScoring( function(data){
        socket.emit('init', { data: data });
    });
});

否则您将无法返回任何内容,因为您在拥有数据时已经超出范围。您可以将其记录到控制台,但不能将其返回。

【讨论】:

  • 此解决方案有效,谢谢。我想,因为console.log 正在提供数据,我不需要使用另一个回调。
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 2016-06-06
  • 2015-06-27
  • 1970-01-01
相关资源
最近更新 更多