2011-08-14 6 views
0

Node.jsで書かれたCMSアプリケーションをRedisデータベースに保持しているとします。このアプリケーションで新しいコンテンツが作成されると、IDカウンタがインクリメントされ、新しいIDがidsのリストに追加され、コンテンツとともに新しいハッシュが設定されます。私が今行うべきことは、この実行を実行する関数を作成することです。この関数(それをcreateArticle()と呼ぶ)はコールバックを持ち、インクリメントを実行します。インクリメントが実行されると、コールバック関数はそれをIDリストにプッシュします。その後、別のコールバックがハッシュを作成します。ハッシュ作成コールバックはcreateArticle()にパラメータとして渡された関数を呼び出します。Node.jsで複数のI/O操作を処理するためのパターン

function createArticle(title, content, callback) { 
    var client = redis.createClient(); 
    client.incr("idCounter", function(err, id) { 
     if (err) return callback(err, data); 
     client.lpush("articleIds", id, function (err, data) { 
      if (err) return callback(err, data); 
      var key = "article:"+id; 
      client.hmset(key, "title", title, "content", content, callback); 
     }); 
    }); 
} 

私は、多かれ少なかれ(この例では、Expressを使用して)このように、この機能を使用します。

app.post('/createarticle', function(req, res) { 
    var title = req.body.article.title, 
     content = req.body.article.content; 
    createArticle(title, content, function(err, data) { 
     if (err) return res.render('error', { status: 500, message: 'Internal Server Error' }); 
     res.render('index', { status: 200, message: 'Article created!' }); 
    }); 
}); 

しかし、これをコードはちょっと面倒です。これは道のりですか?または、一連のI/Oステップを実行するためのより良い方法がありますか?私は私の例ではExpressとRedisを使っていましたが、答えはそれらを使う必要はありません。

答えて

1

あなたは、これらのエラーキャッチャーは、シングル並ぶことができます:

function createArticle(title, content, callback) { 
    var client = redis.createClient() 
    client.incr("idCounter", function(err, id) { 
     if (err) return callback(err, data) 
     client.lpush("articleIds", id, function (err, data) { 
      if (err) return callback(err, data) 
      var key = "article:"+id 
      client.hmset(key, "title", title, "content", content", callback) 
     }) 
    }) 
} 

そして、あなたがエラーを処理するためのヘルパーを使用することができます。そのような

function noError(errorCb, cb) { 
    var slice = Array.prototype.slice 
    return function (err) { 
     var currentCb = err ? errorCb : cb 
     currentCb.apply(this, slice.apply(arguments, err?0:1) 
    } 
} 

function createArticle(title, content, cb) { 
    var client = redis.createClient() 
    client.incr("idCounter", noError(cb, function(id) { 
     client.lpush("articleIds", id, noError(function (data) { 
      var key = "article:"+id 
      client.hmset(key, "title", title, "content", content", callback) 
     })) 
    }) 
} 

か何かを。

+0

素晴らしい提案ですが、私は注意する必要があります。私はそれに準拠するように私のOPを変更しました。しかし、私の論理を構造化する方法は全体として受け入れられると言いますか? – brandizzi

+0

@brandizzi、はい、そうだと思います。いくつかのコールバックレベルがある場合は、インデントが画面の右端に収まらないように、コールバックを名前付き関数に入れることができます。また、エラーをキャッチするヘルパーを使用することができます、私は私の答えに例を入れます。しかし、一般的には、あなたのコードはよく見えると思います。 – thejh

関連する問題