如何写一个正确的回调到包含Promises的get函数?

时间:2016-07-28 16:07:08

标签: node.js promise apache-kafka bluebird

我正在尝试为我的代码编写运行状况检查(此检查涉及与Cassandra DB和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制片人出错:{"消息":"找不到经纪人"}

我有这个代码的另一个版本(没有承诺)并且运行正常,所以我确定我的问题不在于Kafka。

你能告诉我我的代码中有什么错误吗?

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

1 个答案:

答案 0 :(得分:1)

执行此操作时:

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的调用。

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