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
Redis
dokumentasi, 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();
}
});