2012-08-23 19 views
6

के साथ पोल रीस्ट सेवा मैं एक ऐसी सेवा पर काम कर रहा हूं जो फोरस्क्वेयर को हर मिनट या तो कुछ चेक-इन के लिए मतदान करेगी और परिणाम को नोएसQL डेटाबेस में सहेजें/अपडेट करें। SetInterval के साथ http.request को लपेटने के लिए सबसे अच्छा तरीका है और फिर डेटा इवेंट उत्सर्जक का उपयोग करके खंडित प्रतिक्रिया को जोड़ना है? मैं जेएसओएन को पार्स करने के लिए एंड एमिटर का उपयोग करने की योजना बना रहा हूं और अनुरोध पूरा होने पर नोएसक्यूएल डीबी में धक्का देता हूं। विचार?नोड.जेएस

उत्तर

9

वहाँ बेहतर तरीके हो सकते हैं, लेकिन मैं सिर्फ घटना emitters का उपयोग कर के रूप में निम्नानुसार बाकी प्रतिक्रिया पर कार्रवाई करने के समाप्त हो गया:

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

हालांकि, मुझे यकीन है कि मैं क्यों था पार्स आउट "अनिर्धारित" से नहीं कर रहा हूँ JSON मुझे चौकोर से प्राप्त हुआ।

+2

आपको 'अपरिभाषित' का विश्लेषण करने का कारण यह है कि आपने कभी भी 'सामग्री' शुरू नहीं की है। यदि, "var सामग्री;" के बजाय आपके पास "var content = '' है;" आपको कुछ भी पट्टी करने की जरूरत नहीं है। (जब आप एक स्ट्रिंग 'foo' को 'अपरिभाषित' में जोड़ते हैं, तो यह आपको "undefinedfoo" स्ट्रिंग देता है।) –

+0

इसे जोड़ने के लिए धन्यवाद। मैं एक ही काम कर रहा हूं लेकिन मुझे लगता है कि मैंने इसे कभी अपडेट नहीं किया है। संपादित करने के लिए स्वतंत्र महसूस करें मेरा जवाब – occasl

0

जब मैं इसी तरह की समस्या में भाग रहा था, तो मैंने एक समान तकनीक निभाई और यह अच्छी तरह से काम किया। Here's where I got the idea from। उम्मीद है कि यह थोड़ा सा मदद करेगा।

+0

Thx ... मुझे लगता है कि मैं एक ही लेख को देखा लेकिन यह थोड़ा पुराने लग रहा था। – occasl

5

मैं @occasl द्वारा जवाब ठीक करने के बाद, और स्पष्टता के लिए अद्यतन:

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

भविष्य के लिए, बस मेरा जवाब संपादित करें और मैं आपके परिवर्तनों को कोई समस्या नहीं स्वीकार करूंगा। – occasl

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