我正在使用javascript创建节点API.我使用redis作为我的键值存储.我在我的应用程序中创建了一个redis-client,并且能够获得特定密钥的值.
我想检索所有键及其值.到目前为止,我做到了这一点:
app.get('/jobs', function (req, res) { var jobs = []; client.keys('*', function (err, keys) { if (err) return console.log(err); if(keys){ for(var i=0;i但我总是得到空白阵列作为回应.
有没有办法在javascript中执行此操作?
谢谢
1> Aruna..:首先,您的问题中的问题是,在
for
循环内部,client.get
使用异步回调调用,其中同步for
循环不会等待异步回调,因此在异步回调之前的循环之后res.json({data:jobs});
立即调用下一行for
.在res.json({data:jobs});
调用该行时,该数组jobs
仍为空,[]
并返回响应.为了缓解这种情况,您应该使用任何承诺模块,如
async
,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
文档中可以看出,Keys的使用是用于调试和特殊操作,例如更改键空间布局而不适用于生产环境.因此,我建议使用另一个名为redisscan的模块,如下所示,
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(); } });