First of all, the issue in your question is that, inside the for
loop, client.get
is invoked with an asynchronous callback where the synchronous for
loop will not wait for the asynchronous callback and hence the next line res.json({data:jobs});
is getting called immediately after the for
loop before the asynchronous callbacks. At the time of the line res.json({data:jobs});
is getting invoked, the array jobs
is still empty []
and getting returned with the response.
To mitigate this, you should use any promise modules like async
, bluebird
, ES6 Promise
etc.
Modified code using async module,
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});
});
}
});
});
But from the Redis
documentation, it is observed that usage of
Keys are intended for debugging and special operations, such as
changing your keyspace layout and not advisable to production
environments.
Hence, I would suggest using another module called redisscan as below which uses SCAN
instead of KEYS
as suggested in the Redis
documentation.
Something like,
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();
}
});