2012-01-11 3 views
3

私はredisから取得したオブジェクトのJSON表現でノードサービスを提供するためにnode_redisを使用しています。私はおそらくそれはあなたの多くのための比較的基本的なものだと思うが、私は困惑している。私はの前にの前に私の応答を送ってきます。私はすべての私のハッシュを通り抜けて保管しました。ここではCoffeeScriptのです:redisハッシュをJSONに変換するには?

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)); 

それが完了するために、内側のものを待っている間、私は休暇で、私のコードを配置する方法がわかりません。私はそれを扱う方法があると思うが、何も考えることはできない。ありがとうございます。

答えて

2

したがって、client.keysをコールした後でn個のキーを反復処理してからJSON.stringify(オブジェクト)を返すと、各キーのclient.hgetallが呼び出されますが、response.end( JSON.stringify(objects))を呼び出します。

問題は簡単です - 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)); 
     } 
     }); 
    } 
    }); 

私は注意してください、この1つの欠点は、あなたがhgetallの1からの応答を取得することはありませんならばということですこれはタイムアウトになり、応答を出すことはありません。一度にすべての値を取得できるように、ハッシュを保存する方法を変更したり、クライアントが永遠に待機しないように応答を出すために一定の時間が経過した後に呼び出す関数を持つ方が良いかもしれません。

私はなぜこれを書面で書きましたか?それは、そのような翻訳レイヤーを通過しているときに、ノードを書くことに大きな頭痛のように思えます。

+1

ありがとうございます。これは私の問題を解決します。私は、すべてがすべて完了するまで、さらに執行が遅れるような欠けていたパターンがあると思ったが、何度も間違っていた。 「ハッシュをどのように保存するかの変更」に関して、私は常に提案を受け入れています。私はrelationalDBの土地から新鮮で、私は簡単に任意の基準に基づいて "オブジェクト"の束をつかむことに慣れています。 – CircusNinja

+0

私は最初にデータを構造化する方法を見つけようとしている赤字で時間を過ごしたので、クエリが簡単でした。私は "内側"と "外側"の非同期関数を持つたくさんのノードコードを書いて、最後に応答を描画していました。私のスキーマを最終的に変更してデータを取り込み、それをフィルタリングすることができました。しかし、あなたのユースケースにもよりますが、そうするための正当な理由があります。 – tjarratt

関連する問題