如何向包含Promise的get函数编写正确的回调函数?

如何向包含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"); 
     } 
    }); 
}; 
+0

你可以添加有效的代码吗? –

当你这样做:

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的一个电话。

(我问工作代码确认,如果我错过了,我会更新我的答案)。

+0

我添加了可以工作的代码 – CrazySynthax

+0

它看起来像是打电话过早,应该测试我的解决方案。 –

+0

这个答案看起来是正确的,但是使用Bluebird的'Promise.promisify()'来promisify'... execute()'和'... send()'方法会更简单。 –