2012-08-23 15 views
6

私はFoursquareを一定のチェックイン時間ごとにポーリングし、NoSQLデータベースに結果を保存/更新するサービスに取り組んでいます。 setIntervalでhttp.requestをラップし、データイベントエミッターを使用してチャンクレスポンスを集計する最良の方法はありますか? JSONを解析し、リクエストが完了したらNoSQL DBにプッシュするために、エンドエミッタを使用する予定です。思考?Node.jsを使用したPoll RESTサービス

答えて

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私は四角形から受け取った。私は@occaslで答えを固定し、かつ明快にするために更新しました

+2

あなたが 'content'を初期化したことがないので、 'undefined'を解析しなければならない理由があります。 "var content;"の代わりに "あなたは "var content = '';"あなたは何も剥がす必要はありません。 (文字列 'foo'を 'undefined'に追加すると、 "undefinedfoo"という文字列が返されます) –

+0

同じことをやってしまったのですが、ここで更新したことはありません。 – occasl

0

私も同様の問題に遭遇していましたが、私は同様のテクニックを採用していました。 Here's where I got the idea from。うまくいけば、これはちょっと役立つでしょう。

+0

Thxを...私は同じ記事を見てだと思うが、それは少し古いように見えました。 – occasl

5

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

関連する問題