Først og fremmest er problemet i dit spørgsmål, at inde i for
loop, client.get
påkaldes med en asynkron tilbagekald, hvor den synkrone for
loop vil ikke vente på det asynkrone tilbagekald og dermed den næste linje res.json({data:jobs});
bliver kaldt umiddelbart efter for
sløjfe før de asynkrone tilbagekald. På tidspunktet for linjen res.json({data:jobs});
bliver påkaldt, arrayet jobs
er stadig tom []
og blive returneret med svaret.
For at afbøde dette, bør du bruge alle løftemoduler som async
, bluebird
, ES6 Promise
osv.
Ændret kode ved hjælp af async-modul,
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});
});
}
});
});
Men fra Redis
dokumentation, er det observeret, at brug af nøgler er beregnet til fejlfinding og specielle operationer, såsom ændring af dit keyspace-layout og ikke tilrådeligt i produktionsmiljøer.
Derfor vil jeg foreslå at bruge et andet modul kaldet redisscan som nedenfor, som bruger SCAN
i stedet for KEYS
som foreslået i Redis
dokumentation.
Noget som,
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();
}
});