まず第一に、あなたの質問の問題は、for
の内部にあるということです ループ、client.get
非同期で呼び出されます 同期のコールバック for
ループは非同期コールバックを待機しないため、次の行res.json({data:jobs});
for
の直後に呼び出されます 非同期コールバックの前にループします。行の時点でres.json({data:jobs});
呼び出されると、配列jobs
まだ空です[]
応答とともに返されます。
これを軽減するには、async
などのpromiseモジュールを使用する必要があります 、bluebird
、ES6 Promise
など
非同期モジュールを使用して変更されたコード
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
を使用するredisscanという別のモジュールを以下のように使用することをお勧めします。 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();
}
});