Ну, вызовы redis асинхронные. Это означает, что каждый вызов запроса должен получить функцию обратного вызова, которая должна быть вызвана, как только запрос завершит внедрение данных с ошибкой. Чтобы отправить res.json, когда все данные будут готовы, вы должны сделать что-то вроде:
app.get('/api/player/:name', function(req, res) {
var name = req.params.name;
var data = {
"connected": 0,
"health": 0,
"armour": 0
};
var promises = [];
promises.push( new Promise( function(resolve,reject) {
readClient.get(name + '.connected', function(err, value) {
if(err) { reject(err); }
resolve(value);
});
} ) );
promises.push( new Promise( function(resolve,reject) {
readClient.get(name + '.health', function(err, value) {
if(err) { reject(err); }
resolve(value);
});
} ) );
promises.push( new Promise( function(resolve,reject) {
readClient.get(name + '.armour', function(err, value) {
if(err) { reject(err); }
resolve(value);
});
} ) );
Promise.all(promises).then( function(values) {
console.log(values);
data.connected = values[0];
data.health = values[1];
data.armour = values[2];
res.json(data);
} ).catch(handleError);
});
function handleError(err) {
res.status(501);
res.send({msg:err.message});
}
Я бы порекомендовал работать с await и Promises, но это хорошая отправная точка.
Надеюсь, это поможет