En primer lugar, el problema en su pregunta es que, dentro de for
bucle, client.get
se invoca con un asincrónico devolución de llamada donde el sincrónico for
loop no esperará la devolución de llamada asincrónica y, por lo tanto, la siguiente línea res.json({data:jobs});
se llama inmediatamente después de for
bucle antes de las devoluciones de llamada asincrónicas. En el momento de la línea res.json({data:jobs});
se está invocando, la matriz jobs
todavía está vacío []
y ser devuelto con la respuesta.
Para mitigar esto, debe usar cualquier módulo de promesa como async
, bluebird
, ES6 Promise
etc.
Código modificado usando el módulo asíncrono,
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});
});
}
});
});
Pero desde el Redis
documentación, se observa que el uso de Keys está destinado a la depuración y operaciones especiales, como cambiar el diseño del espacio de teclas y no es recomendable para entornos de producción.
Por lo tanto, sugeriría usar otro módulo llamado redisscan como se muestra a continuación, que usa SCAN
en lugar de KEYS
como se sugiere en Redis
documentación.
Algo como,
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();
}
});