我正在使用 javascript 创建一个 Node API。我使用 redis 作为我的键值存储。 我在我的应用程序中创建了一个 redis 客户端,并且能够获取特定键的值。
我想检索所有键及其值。 到目前为止,我已经这样做了:
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<keys.length;i++){
client.get(keys[i], function (error, value) {
if (err) return console.log(err);
var job = {};
job['jobId']=keys[i];
job['data']=value;
jobs.push(job);
});
}
console.log(jobs);
res.json({data:jobs});
}
});
});
但我总是得到空白数组作为响应。
有没有办法在javascript中做到这一点?
谢谢
最佳答案
首先,您的问题中的问题是,在 for
循环中,client.get
是通过 asynchronous 回调调用的synchronous for
循环不会等待异步回调,因此下一行 res.json({data:jobs});
是在异步回调之前的 for
循环之后立即调用。在调用 res.json({data:jobs});
行时,数组 jobs
仍然为空 []
并与响应一起返回。
为了缓解这种情况,您应该使用任何 Promise 模块,例如 async
、bluebird
、ES6 Promise
等。
使用 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});
});
}
});
});
But from the
Redis
documentation, it is observed that usage of Keys are intended for debugging and special operations, such as changing your keyspace layout and not advisable to production environments.
因此,我建议使用另一个名为 redisscan 的模块如下使用 SCAN
而不是 KEYS
如 Redis
documentation 中所建议的那样.
类似的,
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();
}
});
关于javascript - 如何在javascript中获取redis中的所有键和值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42926990/