सबसे पहले, आपके प्रश्न में समस्या यह है कि, for . के अंदर लूप, client.get एक एसिंक्रोनस . के साथ बुलाया जाता है कॉलबैक जहां सिंक्रोनस for लूप एसिंक्रोनस कॉलबैक की प्रतीक्षा नहीं करेगा और इसलिए अगली पंक्ति res.json({data:jobs}); for . के तुरंत बाद कॉल किया जा रहा है एसिंक्रोनस कॉलबैक से पहले लूप। लाइन के समय res.json({data:jobs}); लागू किया जा रहा है, सरणी jobs अभी भी खाली है [] और प्रतिक्रिया के साथ वापस आना।
इसे कम करने के लिए, आपको async . जैसे किसी भी प्रॉमिस मॉड्यूल का उपयोग करना चाहिए , bluebird , ES6 Promise आदि.
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});
});
}
});
});
<ब्लॉकक्वॉट>
लेकिन Redis . से दस्तावेज़ीकरण, यह देखा गया है कि कीज़ का उपयोग डिबगिंग और विशेष संचालन के लिए किया जाता है, जैसे कि आपके कीस्पेस लेआउट को बदलना और उत्पादन वातावरण के लिए उचित नहीं है।
इसलिए, मैं नीचे एक अन्य मॉड्यूल का उपयोग करने का सुझाव दूंगा जिसे रेडिसकैन कहा जाता है जो नीचे SCAN . का उपयोग करता है KEYS . के बजाय जैसा कि Redis . में सुझाया गया है दस्तावेज़ीकरण।
कुछ इस तरह,
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();
}
});