2012-08-23 81 views
6

我的工作,將輪詢每分鐘四方某些簽入左右,保存/更新導致的NoSQL數據庫的服務。用setInterval封裝http.request並使用數據事件發射器聚合分塊響應是最好的方法嗎?我計劃使用最終發射器來解析JSON,並在請求完成時將其壓入NoSQL DB。思考?投票REST服務與Node.js的

回答

9

可能有更好的辦法,但我最終只是使用事件發射器來處理REST響應如下:

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

你必須解析'undefined'的原因是你從未初始化過'content'。如果,而不是「var content」;你有「var content ='';」你不需要去掉任何東西。 (當你將一個字符串'foo'添加到'undefined'時,它會給你一個字符串「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