Przede wszystkim problem w twoim pytaniu polega na tym, że w for
pętla, client.get
jest wywoływany z asynchronicznym wywołanie zwrotne, gdzie synchroniczny for
pętla nie będzie czekać na asynchroniczne wywołanie zwrotne i stąd następna linia res.json({data:jobs});
jest wywoływany natychmiast po for
pętla przed asynchronicznymi wywołaniami zwrotnymi. W momencie wiersza res.json({data:jobs});
jest wywoływana, tablica jobs
jest nadal pusty []
i otrzymanie odpowiedzi z odpowiedzią.
Aby to złagodzić, powinieneś użyć dowolnych modułów obietnic, takich jak async
, bluebird
, ES6 Promise
itp.
Zmodyfikowany kod przy użyciu modułu asynchronicznego,
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});
});
}
});
});
Ale z Redis
dokumentacji, zauważa się, że użycie klawiszy jest przeznaczone do debugowania i operacji specjalnych, takich jak zmiana układu przestrzeni kluczy i nie jest zalecane w środowiskach produkcyjnych.
Dlatego sugerowałbym użycie innego modułu o nazwie redisscan, jak poniżej, który używa SCAN
zamiast KEYS
zgodnie z sugestią w Redis
dokumentacja.
Coś jak,
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();
}
});