Allereerst is het probleem in uw vraag dat, binnen de for
lus, client.get
wordt aangeroepen met een asynchroon terugbellen waar de synchrone for
lus wacht niet op de asynchrone callback en dus de volgende regel res.json({data:jobs});
wordt direct na de for
. gebeld loop vóór de asynchrone callbacks. Op het moment van de regel res.json({data:jobs});
wordt aangeroepen, de array jobs
is nog leeg []
en teruggestuurd worden met het antwoord.
Om dit te verminderen, moet u beloftemodules gebruiken, zoals async
, bluebird
, ES6 Promise
enz.
Gewijzigde code met asynchrone module,
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});
});
}
});
});
Maar van de
Redis
documentatie, wordt opgemerkt dat het gebruik van Keys bedoeld is voor debuggen en speciale bewerkingen, zoals het wijzigen van de lay-out van de keyspace en niet aan te raden is voor productieomgevingen.
Daarom zou ik willen voorstellen om een andere module genaamd redisscan te gebruiken, zoals hieronder, die gebruikmaakt van SCAN
in plaats van KEYS
zoals voorgesteld in de Redis
documentatie.
Iets als,
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();
}
});