如何为包含承诺的get函数编写正确的回调?

w3nuxt5m  于 2021-06-08  发布在  Kafka
关注(0)|答案(1)|浏览(349)

我正在尝试为我的代码编写一个健康检查(这个检查涉及到与cassandradb和kafka的通信)。
这是我写的代码:

// 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”
kafka producer出错:{“message”:“找不到代理”}
我有另一个版本的代码(没有承诺),它运行正常,所以我相信我的问题不是Kafka。
你能告诉我代码中有哪些错误吗?
p、 我还查看了这个链接:使用bluebird在promises中 Package node.js回调,但对我没有帮助。
编辑:以下是工作代码:

// 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");
      }
    });
};
qxgroojn

qxgroojn1#

当您这样做时:

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/Kafka的调用。
(我要求工作代码确认,如果我错过了,我会更新我的答案)。

相关问题