2012-01-30 18 views
10

node.jsを使用して、安らかなAPIにサーバー側の呼び出しをしようとしています。 JSONP(JS関数内のJSONコンテナ)を返すと、ノードhttp.get(options、callback)APIの中心にあると思われるエラーが返されます。ノードまたは任意のモジュールがJSONP戻り値からJSONオブジェクトを返すことはできますか?ノードJSONPを返す安らかな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

+0

request = require( 'request'); (myObject = eval( '(+ body +' body + 'body +' body +) ');}}}} )  ); }; – user690740

+0

リンクされたコールバックパラメータ(&callback = functionName)を使用すると、任意の名前にラッパー関数を変更できます。私は幸せな人になるでしょう。 – user690740

答えて

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

は、そのようにようにそれを使用します。vm

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

でコールバックを実行し

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

前の回答は、コールバック関数をストライピング示唆しています。残念ながら、これは多くのjsonpレスポンスと互換性がありません。なぜなら、関数の内容は通常は純粋なJSONではなくオブジェクトであるからです。 JSON.parse()関数は、次のようなもののために死ぬだろう:

callback({key:"value"}); 

を上記有効なオブジェクトですが、それが有効なJSONではありません。

以下は、コールバックを実行し、オブジェクトを返します。

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

JSONP応答で返されるコールバック関数の名前にコンテキスト変更callbackを作成するとき。

+2

briliantは完璧に動作します。 –

関連する問題