Först och främst är problemet i din fråga att, inuti for
loop, client.get
anropas med en asynkron återuppringning där synkron for
loop kommer inte att vänta på den asynkrona återuppringningen och därmed nästa rad res.json({data:jobs});
anropas omedelbart efter for
loop före de asynkrona återuppringningarna. Vid tidpunkten för raden res.json({data:jobs});
anropas, arrayen jobs
är fortfarande tom []
och få tillbaka svaret.
För att mildra detta bör du använda alla löftesmoduler som async
, bluebird
, ES6 Promise
etc.
Modifierad kod med asynkronmodul,
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 från
Redis
dokumentation, observeras att användning av nycklar är avsedd för felsökning och speciella operationer, såsom att ändra din tangentrymdslayout och är inte tillrådlig för produktionsmiljöer.
Därför skulle jag föreslå att du använder en annan modul som heter redisscan som nedan som använder SCAN
istället för KEYS
som föreslås i Redis
dokumentation.
Något 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();
}
});