Prima di tutto, il problema nella tua domanda è che, all'interno di for
loop, client.get
viene invocato con un asincrono callback dove sincrono for
loop non attenderà la richiamata asincrona e quindi la riga successiva res.json({data:jobs});
viene chiamato immediatamente dopo il for
ciclo prima dei callback asincroni. Al momento della riga res.json({data:jobs});
viene richiamato, l'array jobs
è ancora vuoto []
e di essere restituito con la risposta.
Per mitigare questo, dovresti usare qualsiasi modulo di promessa come async
, bluebird
, ES6 Promise
ecc.
Codice modificato utilizzando il modulo asincrono,
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});
});
}
});
});
Ma dal Redis
documentazione, si osserva che l'uso delle chiavi è inteso per il debug e operazioni speciali, come la modifica del layout dello spazio delle chiavi e non è consigliabile per gli ambienti di produzione.
Quindi, suggerirei di utilizzare un altro modulo chiamato redisscan come di seguito che utilizza SCAN
invece di KEYS
come suggerito nel Redis
documentazione.
Qualcosa come,
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();
}
});