NodeJS + Socket.IO不能让json返回

我使用的是Socket.IO,AngularJS,Request和Express,我试图从请求中提取一些数据,然后把它发送给客户端。 这是我的function:

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解决scheme来自另一篇文章,它产生了良好的结果。

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

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

所以你可能也想传递一个callback函数getScoring() ,然后在该callback中发出事件。 像这样的例子:

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

否则你将无法返回任何东西,因为当你有数据时你已经超出了范围。 您可以将其logging到控制台,但不能返回。