2012-08-23 11 views
6

Estoy trabajando en un servicio que sondearía Foursquare para realizar comprobaciones cada minuto o así y guardar/actualizar los resultados en una base de datos NoSQL. ¿Es el mejor enfoque para ajustar una http.request con setInterval y luego agregar la respuesta fragmentada utilizando el emisor de eventos de datos? Planeo usar el emisor final para analizar el JSON e insertarlo en un DB NoSQL cuando la solicitud esté completa. ¿Pensamientos?Servicio REST de sondeo con Node.js

Respuesta

9

Puede haber mejores maneras, pero acabé utilizando emisores de eventos para procesar la respuesta RESTO de la siguiente manera:

var fourSquareGet = { 
    host: 'api.foursquare.com', 
    port: 443, 
    path: '/v2/venues/search?ll=33.88,-119.19&query=burger*', 
    method: 'GET' 
}; 
setInterval(function() { 
    var reqGet = https.request(fourSquareGet, function (res) { 
     var content; 

     res.on('data', function (chunk) { 
      content += chunk; 
     }); 
     res.on('end', function() { 
      // remove 'undefined that appears before JSON for some reason 
      content = JSON.parse(content.substring(9, content.length)); 
      db.checkins.save(content.response.venues, function (err, saved) { 
       if (err || !saved) throw err; 
      }); 
      console.info("\nSaved from Foursquare\n"); 
     }); 
    }); 

    reqGet.end(); 
    reqGet.on('error', function (e) { 
     console.error(e); 
    }); 
}, 25000); 

Sin embargo, no estoy seguro de por qué tenía omita "indefinido" de la JSON que recibí de foursquare.

+2

La razón por la que tiene que analizar 'indefinido' es porque nunca inicializó 'content'. Si, en lugar de "var content"; tienes "var content = '';" no necesitas desnudar nada (Cuando agrega una cadena 'foo' a 'indefinido', le da la cadena "undefinedfoo '.) –

+0

Gracias por agregar eso. Terminé haciendo lo mismo, pero supongo que nunca lo actualicé aquí. No dude en editarlo mi respuesta. – occasl

0

Cuando me encontré con un problema similar, empleé una técnica similar y funcionó bien. Here's where I got the idea from. Espero que esto ayude un poco.

+0

Thx ... creo que miraba el mismo artículo pero parecía un poco viejo. – occasl

5

he fijado por la respuesta @occasl, y actualizados para mayor claridad:

var https = require('https'); 

setInterval(function() { 

    var rest_options = { 
     host: 'api.example.com', 
     port: 443, 
     path: '/endpoint', 
     method: 'GET' 
    }; 

    var request = https.request(rest_options, function(response) { 
     var content = ""; 

     // Handle data chunks 
     response.on('data', function(chunk) { 
      content += chunk; 
     }); 

     // Once we're done streaming the response, parse it as json. 
     response.on('end', function() { 
      var data = JSON.parse(content); 

      //TODO: Do something with `data`. 
     }); 
    }); 

    // Report errors 
    request.on('error', function(error) { 
     console.log("Error while calling endpoint.", error); 
    }); 

    request.end(); 
}, 5000); 
+5

Para el futuro, simplemente edite mi respuesta y aceptaré sus cambios sin ningún problema. – occasl

Cuestiones relacionadas