2012-01-30 64 views
10

我正在嘗試使用node.js對服務器端調用restful API。使用JSONP(JS函數內的JSON容器)返回返回的錯誤,這似乎是節點http.get(options,callback)API的核心。節點或任何模塊是否可以從JSONP返回JSON對象?節點返回JSONP的Restful api的HTTP請求

例JSONP請求: 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/

+0

你能不能代碼?我注意到在url中沒有回調引用。通常這看起來像&callback = foo或&jsonp = bar。 LinkedIn看起來像迴應迴應。然後,您可以使用url.parse來查找該參數並採取相應措施。 – booyaa 2012-01-30 11:35:07

+0

request = require('request'); request({uri:'http://graph.facebook.com/?ids=http://appsumo.com'},function(err,responser,body){myObject = eval('('+ body +') )'); }; – user690740 2012-02-02 11:15:45

+0

帶有linkedin的回調參數(&callback = functionName)讓我可以將包裝器函數更改爲我希望的任何名稱(但不能將它們一起移除)如果我能得到有效的響應(JSON或JSONP)從模塊或API HTTP請求與JS下的節點。我會是一個快樂的人。 – user690740 2012-02-02 11:19:47

回答

6

我會寫來檢查JSON和剝掉返回字符串的功能只是爲了避免運行的eval包裝函數。然後JSON.parse字符串(現在減去函數,因爲我們刪除它)返回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); 
}); 
8

vm

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

前面的回答中建議的條帶化回調函數執行回調。不幸的是,這與許多jsonp響應不兼容,因爲函數的內容通常是對象而不是純JSON。的JSON.parse()來函數將用於類似下面的死:

callback({key:"value"}); 

儘管上面是一個有效的對象,它是無效的JSON。

下面將進行回調並返回對象:

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

當創建上下文變化callback到在JSONP響應返回的回調函數的名稱。

+2

briliant。完美的作品。 – 2015-03-19 17:15:27