2012-01-30 10 views
10

Estoy intentando hacer llamadas del lado del servidor a API relajadas usando node.js. Las devoluciones con JSONP (contenedor JSON dentro de una función JS) devuelven errores que parecen estar en el corazón de la API del nodo http.get (opciones, devolución de llamada). ¿Puede el nodo o cualquier módulo devolver el objeto JSON de un retorno JSONP?Requerimiento de la solicitud HTTP del nodo para las API tranquilas que devuelven JSONP

solicitud

Ejemplo 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

¿Puedes encontrar el código? Me di cuenta de que no hay referencia de devolución de llamada en la url. Usualmente esto se ve como & callback = foo o & jsonp = bar. Parece que LinkedIn responde a la devolución de llamada. A continuación, puede usar url.parse para encontrar ese parámetro y actuar en consecuencia. – booyaa

+0

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

+0

El parámetro de devolución de llamada (& callback = nombreFunción) con linkedin me permite cambiar la función contenedora a cualquier nombre que desee (pero no eliminarlo todo junto). Si pudiera obtener una respuesta válida (JSON o JSONP) desde y el módulo o la solicitud HTTP API con JS en Node. Sería un hombre feliz. – user690740

Respuesta

6

me gustaría escribir una función de contenedor que comprueba JSON y despoja a la función de la cadena devuelta sólo para evitar correr eval. Luego JSON.parse en la cadena (ahora menos la función desde que lo quitamos) para devolver 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); 
    } 
}) 
} 

Entonces usarlo de esta manera:

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

Ejecutar la devolución de llamada con vm

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

Una respuesta anterior sugiere la creación de bandas de la función de devolución de llamada. Desafortunadamente, esto no es compatible con muchas respuestas de jsonp ya que los contenidos de la función suelen ser objetos y no JSON puro. La función JSON.parse() a morir por algo como el siguiente:

callback({key:"value"}); 

Aunque lo anterior es un objeto válido, no es JSON válida.

A continuación se ejecutará la devolución de llamada y devolver el objeto:

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

Al crear el cambio de contexto callback al nombre de la función de devolución de llamada que se devuelve en la respuesta jsonp.

+2

briliant. Funciona a la perfección. –

Cuestiones relacionadas