Pertama-tama, masalah dalam pertanyaan Anda adalah, di dalam for loop, client.get dipanggil dengan asinkron panggilan balik di mana sinkron for loop tidak akan menunggu panggilan balik asinkron dan karenanya baris berikutnya res.json({data:jobs}); dipanggil segera setelah for loop sebelum panggilan balik asinkron. Pada saat baris res.json({data:jobs}); sedang dipanggil, larik jobs masih kosong [] dan mendapatkan balasan dengan tanggapan.
Untuk mengurangi ini, Anda harus menggunakan modul janji apa pun seperti async , bluebird , ES6 Promise dll.
Kode yang dimodifikasi menggunakan modul 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});
});
}
});
});
Tapi dari
Redisdokumentasi, diamati bahwa penggunaan Kunci dimaksudkan untuk debugging dan operasi khusus, seperti mengubah tata letak ruang kunci Anda dan tidak disarankan untuk lingkungan produksi.
Oleh karena itu, saya sarankan menggunakan modul lain yang disebut redisscan seperti di bawah ini yang menggunakan SCAN bukannya KEYS seperti yang disarankan dalam Redis dokumentasi.
Sesuatu seperti,
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();
}
});