Tout d'abord, le problème dans votre question est que, à l'intérieur du for
boucle, client.get
est invoqué avec un asynchrone rappel où le synchrone for
loop n'attendra pas le rappel asynchrone et donc la ligne suivante res.json({data:jobs});
est appelé immédiatement après le for
boucle avant les rappels asynchrones. Au moment de la ligne res.json({data:jobs});
est invoqué, le tableau jobs
est encore vide []
et d'être renvoyé avec la réponse.
Pour atténuer cela, vous devez utiliser tous les modules de promesse comme async
, bluebird
, ES6 Promise
etc.
Code modifié à l'aide du module asynchrone,
app.get('/jobs', function (req, res) {
var jobs = [];
client.keys('*', function (err, keys) {
if (err) return console.log(err);
if(keys){
async.map(keys, function(key, cb) {
client.get(key, function (error, value) {
if (error) return cb(error);
var job = {};
job['jobId']=key;
job['data']=value;
cb(null, job);
});
}, function (error, results) {
if (error) return console.log(error);
console.log(results);
res.json({data:results});
});
}
});
});
Mais depuis le
Redis
documentation, il est observé que l'utilisation des clés est destinée au débogage et aux opérations spéciales, telles que la modification de la disposition de votre espace de clés et déconseillée aux environnements de production.
Par conséquent, je suggérerais d'utiliser un autre module appelé redisscan comme ci-dessous qui utilise SCAN
au lieu de KEYS
comme suggéré dans le Redis
documents.
Quelque chose comme,
var redisScan = require('redisscan');
var redis = require('redis').createClient();
redisScan({
redis: redis,
each_callback: function (type, key, subkey, value, cb) {
console.log(type, key, subkey, value);
cb();
},
done_callback: function (err) {
console.log("-=-=-=-=-=--=-=-=-");
redis.quit();
}
});