私は、Foursquare に特定のチェックインを 1 分ごとにポーリングし、結果を NoSQL データベースに保存/更新するサービスに取り組んでいます。http.request を setInterval でラップし、データ イベント エミッターを使用してチャンクされた応答を集約する最善の方法はありますか? エンドエミッターを使用して JSON を解析し、リクエストが完了したら NoSQL DB にプッシュする予定です。考え?
7174 次
3 に答える
10
より良い方法があるかもしれませんが、次のようにイベント エミッターを使用して 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 から「未定義」を解析した理由がわかりません。
于 2012-08-24T18:24:02.103 に答える
6
@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);
于 2013-03-21T15:59:51.953 に答える
0
同様の問題に遭遇したとき、同様の手法を採用しましたが、うまくいきました。ここからアイデアを得ました。うまくいけば、これは少し役立つでしょう。
于 2012-08-23T17:38:36.177 に答える