First of all, the problem in your question is that inside the for client.get is called with an asynchronous callback, where the synchronous for loop will not wait for the asynchronous callback and therefore the next line res.json({data:jobs}); called immediately after the for loop before asynchronous callbacks. While calling the string res.json({data:jobs}); the jobs array remains empty [] and returns with a response.
To mitigate this, you should use any of the same name modules like async , bluebird , ES6 Promise , etc.
Modified code using async ,
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 noted that the use of Keys is intended for debugging and special operations, such as changing keyboard layouts and inappropriate production environments.
Therefore, I would suggest using another module called redisscan , as shown 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(); } });