我正在使用 node_redis 为 Node 服务提供我从 redis 获取的对象的 JSON 表示。我认为这对你们很多人来说可能是相对基本的东西,但我很难过。 在我已经完成所有哈希并存储它们之前,我已经到了发送响应的地步。这是 CoffeeScript :
objects = []
client.keys 'objects*', (err,keys) ->
for key in keys
client.hgetall key, (err,obj) ->
objects.push obj
response.end JSON.stringify objects
和生成的 JavaScript:
objects= [];
client.keys('objects*', function(err, keys) {
var key, _i, _len, _results;
_results = [];
for (_i = 0, _len = keys.length; _i < _len; _i++) {
key = keys[_i];
_results.push(client.hgetall(key, function(err, obj) {
return objects.push(obj);
}));
}
return _results;
});
return response.end(JSON.stringify(objects));
我不知道如何在等待内部内容完成时让我的代码休假。我怀疑有某种方法可以处理它,但我想不出任何办法。感谢大家。
最佳答案
因此,您要遍历 n 个键,然后在调用 client.keys(它会依次为每个键调用 client.hgetall?)之后返回 JSON.stringify(objects),然后返回 response.end(JSON .stringify(objects)) 在调用 client.keys 之后。
问题很简单——您需要在追加 hgetkeys 结果的函数内呈现一个响应,但前提是您看到了 hgetkeys 的所有响应。
我不是 coffeescript 爱好者,但这里有一个应该可以工作的 javascript 版本:
objects= [];
client.keys('objects*', function(err, keys) {
var key, _i, _len, seen;
seen = 0;
for (_i = 0, _len = keys.length; _i < _len; _i++) {
key = keys[_i];
client.hgetall(key, function(err, obj) {
objects.push(obj);
seen++;
if (seen == len) {
return response.end(JSON.stringify(objects));
}
});
}
});
我应该注意,这样做的一个缺点是,如果您从未从其中一个 hgetall 请求中得到响应,这将超时并且您将永远不会发出响应。最好更改存储散列的方式,这样您就可以一次获取所有值,或者拥有一个函数,您可以在一定时间后调用该函数来发出响应,这样您的客户就不会永远等待。
请问你为什么选择用coffeescript写这个?当 Node 要经过这样的翻译层时,编写 Node 似乎非常头疼。
关于node.js - 如何将 Redis 哈希值转换为 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8827334/