Zunächst einmal ist das Problem in Ihrer Frage das innerhalb des for
Schleife, client.get
wird mit einem asynchronen aufgerufen Rückruf, wobei die synchrone for
Schleife wartet nicht auf den asynchronen Rückruf und damit auf die nächste Zeile res.json({data:jobs});
wird unmittelbar nach dem for
aufgerufen Schleife vor den asynchronen Callbacks. Zum Zeitpunkt der Zeile res.json({data:jobs});
aufgerufen wird, das Array jobs
ist noch leer []
und erhalten die Antwort zurück.
Um dies abzumildern, sollten Sie Zusagemodule wie async
verwenden , bluebird
, ES6 Promise
usw.
Modifizierter Code mit 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});
});
}
});
});
Aber aus dem Redis
Dokumentation wird angemerkt, dass die Verwendung von Schlüsseln für das Debuggen und spezielle Operationen gedacht ist, wie z. B. das Ändern Ihres Schlüsselraumlayouts, und für Produktionsumgebungen nicht ratsam ist.
Daher würde ich vorschlagen, ein anderes Modul namens redisscan wie unten zu verwenden, das SCAN
verwendet statt KEYS
wie in Redis
vorgeschlagen Dokumentation.
Etwas wie,
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();
}
});