2012-08-23 6 views
6

Ich arbeite an einem Service, der Foursquare für bestimmte Check-Ins jede Minute oder so abfragte und die Ergebnisse in einer NoSQL-Datenbank speichern/aktualisieren würde. Ist der beste Ansatz, eine http.request mit setInterval zu umbrechen und dann die chunked response mithilfe des Datenereignis-Emitters zu aggregieren? Ich plane, den Endemitter zu verwenden, um den JSON zu analysieren und in eine NoSQL DB zu schieben, wenn die Anforderung abgeschlossen ist. Gedanken?Umfrage REST-Service mit Node.js

Antwort

9

Es könnte bessere Möglichkeiten, aber ich endete nur mit Ereignis-Emitter, um die REST-Antwort wie folgt zu verarbeiten:

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

Allerdings bin ich mir nicht sicher, warum ich aus der parsen „undefiniert“ hatte JSON erhielt ich von foursquare.

+2

Der Grund, warum Sie 'undefiniert' analysieren müssen, ist, dass Sie 'content' nie initialisiert haben. Wenn, statt "var content;" Du hast "var content = '';" Sie müssen nichts abstreifen. (Wenn Sie eine Zeichenfolge 'foo' zu 'undefined' hinzufügen, erhalten Sie die Zeichenfolge 'undefinedfoo'.) –

+0

Vielen Dank für das Hinzufügen. Ich endete das gleiche, aber ich glaube, ich habe es hier nie aktualisiert. Fühlen Sie sich frei zu bearbeiten meine Antwort – occasl

0

Als ich auf ein ähnliches Problem stieß, verwendete ich eine ähnliche Technik und es funktionierte gut. Here's where I got the idea from. Hoffentlich hilft das ein bisschen.

+0

Thx ... Ich glaube, ich auf dem gleichen Artikel aussah, aber es schien ein bisschen alt. – occasl

5

Ich habe die Antwort von @occasl fixiert und für Klarheit aktualisiert:

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

Für die Zukunft, nur meine Antwort bearbeiten und ich werde Ihre Änderungen akzeptieren, kein Problem. – occasl