2016-07-28 9 views
0

私のコードのヘルスチェックを書こうとしています(このチェックでは、カッサンドラDBとカフカとのやり取りが含まれていました)。Promisesを含むget関数に正しいコールバックを書き込む方法は?

これは私が書いたコードです:

// health-check 
app.get('/stats/health', function(req, res, next) { 
    Promise.all([cassandraPromise, kafkaPromise]) 
     .then(console.log("Everything is OK"), 
     console.log("FAILED!")); 
}); 


var cassandraPromise = new Promise(function(resolve, reject){ 
    *****.client.state.cassandraClient.execute('SELECT vehicle_id FROM vehicles.vehicles LIMIT 1', function(err) { 
    if (err) { 
     console.log ('Health Check for Cassandra failed'); 
     //res.write("Cassandra health check FAILED\n"); 
     reject(err); 
    } else { 
     console.log('Health Check for Cassandra passed\n'); 
     resolve(200); 
    } 
    }); 
}); 

var kafkaPromise = new Promise(function(resolve,reject) { 
    stats.kafkaService.producer.send([{topic: 'health_check', messages: 'health check message'}], function(err,data) { 
    if (err) { 
     //res.write("Health Check for Kafka failed\n"); 
     console.log("Health Check for Kafka failed"); 
     reject(err); 
    } else { 
     console.log("Health Check for Kafka passed"); 
     resolve(200); 
    } 
    }); 
}); 

は、エラーメッセージは次のとおりです。

'queryFetchSizeは' が定義されていませんでした。デフォルトの使用: '25000'

'socketReadTimeout'が定義されていません。カフカのプロデューサーに「30000」

エラー:{「メッセージ」:「ブローカーを見つけることができませんでした」}デフォルト使用

を私は(約束なし)このコードの別のバージョンを持っているし、それが適切に実行され、私の問題はカフカではないと確信しています。

私のコードのミスは何ですか?

P.S.私もこのリンクをチェックアウト:Wrapping Node.js callbacks in Promises using Bluebird とそれは私を助けませんでした。

編集:ここでは は、作業コードがある:あなたがこれを行う場合は

// health-check 
app.get('/stats/health', cassandraHealthCheck, kafkaHealthCheck); 

function cassandraHealthCheck(req, res, next) { 
    ******.client.state.cassandraClient.execute('SELECT vehicle_id FROM vehicles.vehicles LIMIT 1', function(err) { 
    if (err) { 
     console.log ('Health Check for Cassandra failed'); 
    } else { 
     console.log('Health Check for Cassandra passed'); 
     next(); 
    } 
    }); 
} 

function kafkaHealthCheck(req, res, next) { 
    stats.kafkaService.producer.send([{topic: 'health_check', messages: 'health check message'}], function(err,data) { 
     if (err) { 
     console.log("Health Check for Kafka failed"); 
     } else { 
     console.log("Health Check for Kafka passed"); 
     } 
    }); 
}; 
+0

正常に動作するコードを追加できますか? –

答えて

1

app.get('/stats/health', function(req, res, next) { 
    Promise.all([cassandraPromise, kafkaPromise]) 
}); 

var cassandraPromise = new Promise(...); 
var kafkaPromise = new Promise(...); 

をすぐをロードします2つの約束を作成します。あなたのカフカクライアントはまだ準備ができておらず、約束を破ると思います。

/stats/healthに電話すると、すでに解決されている2つの約束を使用します()。 Promise.allは約束を破棄して終了します(012秒前にkafkaPromiseが失敗したため)。

function checkCassandra() { 
    return new Promise(...); 
} 

function checkKafka() { 
    return new Promise(...); 
} 

app.get('/stats/health', function(req, res, next) { 
    Promise.all([checkCassandra(), checkKafka()]) 
}); 

その方法は、あなたが/カフカあなたがヘルスチェックを呼び出すたびカサンドラへの呼び出しをトリガーします:あなたが何をしたいか

は、新たな約束を毎回作成することです。

(確認するための作業コードを尋ねましたが、私が逃した場合は私の回答を更新します)

+0

私は動作するコードを追加しました – CrazySynthax

+0

本当に早すぎる呼び出しのように見えます。私の解決策をテストする必要があります。 –

+0

この答えは正しいと思われますが、Bluebirdの 'Promise.promisify()'を使って '... execute()'と '... send()'メソッドを約束する方が簡単です。 –

関連する問題