为返回JSONP的Restful api节点HTTP请求

我正在尝试使用node.js将服务器端调用到restful API。 使用JSONP(JS函数中的JSON容器)返回正在返回的错误,这似乎是节点http.get(options,callback)API的核心。 节点或任何模块能否从JSONP返回JSON对象?

示例JSONP请求: http : //www.linkedin.com/countserv/count/share? url= http : //techcrunch.com/2012/01/29/turning-two-founderscard-pulls-back-the-curtain-在其通会员制社区的创业者/

用vm执行callback

JavaScript code can be compiled and run immediately or compiled, saved, and run later 

以前的答案build议剥离callback函数。 不幸的是,这与许多jsonp响应不兼容,因为函数的内容通常是对象而不是纯JSON。 JSON.parse()函数将会死掉,如下所示:

 callback({key:"value"}); 

虽然上面是一个有效的对象,但它不是有效的JSON。

以下将执行callback并返回对象:

 jsonpSandbox = vm.createContext({callback: function(r){return r;}}); myObject = vm.runInContext(jsonpData,jsonpSandbox); 

创build上下文更改callback到jsonp响应中返回的callback函数的名称。

我会写一个包装函数来检查JSON,并将函数从返回的string中删除,以避免运行eval。 然后JSON.parsestring(现在减去函数,因为我们删除它)返回json。

 var request = require('request'); var getJsonFromJsonP = function (url, callback) { request(url, function (error, response, body) { if (!error && response.statusCode == 200) { var jsonpData = body; var json; //if you don't know for sure that you are getting jsonp, then i'd do something like this 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); } }) } 

然后像这样使用它:

 getJsonFromJsonP('http://www.linkedin.com/countserv/count/share?url=http://techcrunch.com/2012/01/29/turning-two-founderscard-pulls-back-the-curtain-on-its-membership-community-for-entrepreneurs/', function (err, data) { console.log('data count', data.count); });