如何向包含Promise的get函数编写正确的回调函数?
我正在为我的代码写一份健康检查(此检查涉及与Cassandra DB和Kafka的沟通)。如何向包含Promise的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");
}
});
};
当你这样做:
app.get('/stats/health', function(req, res, next) {
Promise.all([cassandraPromise, kafkaPromise])
});
var cassandraPromise = new Promise(...);
var kafkaPromise = new Promise(...);
您创建两个承诺将立即加载。我认为你的kafka客户端还没有准备好,并且没有兑现承诺。
然后(比如说30秒后),当您拨打/stats/health
时,您使用已经解决的两个现有承诺。 Promise.all
以失败的承诺结尾(因为kafkaPromise
在30秒前失败)。
你想要做的是每次创建一个新的承诺:
function checkCassandra() {
return new Promise(...);
}
function checkKafka() {
return new Promise(...);
}
app.get('/stats/health', function(req, res, next) {
Promise.all([checkCassandra(), checkKafka()])
});
这样的话,你会触发每次调用健康检查时间/卡夫卡到Cassandra的一个电话。
(我问工作代码确认,如果我错过了,我会更新我的答案)。
我添加了可以工作的代码 – CrazySynthax
它看起来像是打电话过早,应该测试我的解决方案。 –
这个答案看起来是正确的,但是使用Bluebird的'Promise.promisify()'来promisify'... execute()'和'... send()'方法会更简单。 –
你可以添加有效的代码吗? –