Trước hết, vấn đề trong câu hỏi của bạn là bên trong for
loop, client.get
được gọi bằng không đồng bộ gọi lại trong đó đồng bộ for
vòng lặp sẽ không đợi lệnh gọi lại không đồng bộ và do đó dòng tiếp theo res.json({data:jobs});
được gọi ngay sau for
vòng lặp trước các lệnh gọi lại không đồng bộ. Tại thời điểm của dòng res.json({data:jobs});
đang được gọi, mảng jobs
vẫn trống []
và nhận được phản hồi.
Để giảm thiểu điều này, bạn nên sử dụng bất kỳ mô-đun hứa hẹn nào như async
, bluebird
, ES6 Promise
vv
Đã sửa đổi mã sử dụng mô-đun không đồng bộ,
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});
});
}
});
});
Nhưng từ
Redis
tài liệu hướng dẫn, có thể thấy rằng việc sử dụng Keys nhằm gỡ lỗi và các hoạt động đặc biệt, chẳng hạn như thay đổi bố cục không gian phím của bạn và không khuyến khích sử dụng các môi trường sản xuất.
Do đó, tôi khuyên bạn nên sử dụng một mô-đun khác có tên là redisscan như bên dưới sử dụng SCAN
thay vì KEYS
như được đề xuất trong Redis
tài liệu.
Một cái gì đó như,
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();
}
});