2012-01-30 8 views
10

लौटाता है मैं node.js. का उपयोग कर सर्वर एपीआई को आराम से कॉल करने का प्रयास कर रहा हूं। JSONP (जेएस फ़ंक्शन के अंदर JSON कंटेनर) के साथ रिटर्न त्रुटियों को वापस कर रहा है जो नोड http.get (विकल्प, कॉलबैक) API के केंद्र में दिखाई देता है। क्या नोड या कोई मॉड्यूल JSONP ऑब्जेक्ट को JSONP रिटर्न से वापस कर सकता है?शेष एपीआई के लिए नोड HTTP अनुरोध जो JSONP

उदाहरण 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

क्या आप कोड जोड़ सकते हैं? मैंने देखा है कि यूआरएल में कोई कॉलबैक संदर्भ नहीं है। आमतौर पर ऐसा लगता है और कॉलबैक = foo या jsonp = bar। ऐसा लगता है कि लिंक्डइन कॉलबैक का जवाब देता है। फिर आप उस पैरामीटर को खोजने और तदनुसार कार्य करने के लिए url.parse का उपयोग कर सकते हैं। – booyaa

+0

अनुरोध = आवश्यकता ('अनुरोध'); अनुरोध ({uri: 'http://graph.facebook.com/?ids=http://appsumo.com'}, फ़ंक्शन (त्रुटि, प्रतिक्रियाकर्ता, शरीर) {myObject = eval ('(' + body + ') '); }; – user690740

+0

लिंकबैक के साथ कॉलबैक पैरामीटर (और कॉलबैक = फ़ंक्शननाम) मुझे रैपर फ़ंक्शन को किसी भी नाम पर बदल देता है (लेकिन इसे सभी को एक साथ नहीं हटाएं)। अगर मुझे वैध प्रतिक्रिया मिल सकती है (JSON या JSONP) जेड के साथ जेड के साथ मॉड्यूल या एपीआई HTTP अनुरोध। मैं एक खुश व्यक्ति होगा। – user690740

उत्तर

6

मैं एक आवरण समारोह है कि JSON जांच करता है और लौट आए स्ट्रिंग बंद समारोह सिर्फ eval चल रहा से बचने के लिए स्ट्रिप्स लिखना चाहते हैं। फिर जेसन वापस करने के लिए स्ट्रिंग पर JSON.parse (अब फ़ंक्शन को घटाएं क्योंकि हमने इसे हटा दिया है)।

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 

पिछले जवाब कॉलबैक फ़ंक्शन striping पता चलता है के साथ कॉलबैक निष्पादित। दुर्भाग्यवश, यह कई jsonp प्रतिक्रियाओं के साथ संगत नहीं है क्योंकि फ़ंक्शन की सामग्री आमतौर पर ऑब्जेक्ट्स होती है और शुद्ध JSON नहीं होती है। JSON.parse() समारोह निम्नलिखित की तरह कुछ के लिए मर जाएगा:

callback({key:"value"}); 

जबकि ऊपर मान्य वस्तु है, यह मान्य JSON नहीं है।

निम्नलिखित कॉलबैक निष्पादित और वस्तु वापस आ जाएगी:

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

जब कॉलबैक समारोह है कि jsonp जवाब में लौटाया जाए, उनके नाम के संदर्भ परिवर्तन callback बनाने।

+2

शानदार। पूरी तरह से काम करता है। –

संबंधित मुद्दे