1

nanoで再利用可能なデータベース呼び出しを使用して小さなライブラリを作成しようとしています。

db.view('list', 'people', function(error, data) {
  if (error == null) {
    res.render('people/index', {
      people: data.rows
    });
  } else {
    // error
  }
});

複数のリクエストがある場合、これは非常に厄介になる可能性があります。

db.view('list', 'people', function(error, people) {
  db.view('list', 'items', function(error, items) {
    db.view('list', 'questions', function(error, questions) {
      db.view('list', 'answers', function(error, answers) {
        ...
        res.render('people/index', {
          people: people.rows,
          items: items.rows,
          questions: questions.rows
          ...

したがって、アイデアは関数を作成することでした。

var getPeople = function() {
  // do db calls here and return
}

res.render('people/index', {
  people: getPeople()
});

しかし、それはうまくいきません。

これを解決して、すべてを外部のnode-js-module.jsファイルに入れるにはどうすればよいですか?

4

4 に答える 4

3

caolan の aysnc ライブラリをお勧めします。非常に使いやすく、require を使用してブラウザーとカウチの両方で動作します (カウチ側でクエリを使用するわけではありません)。

特定の問題については、シリーズまたはウォーターフォールを使用できます。

于 2012-02-16T18:20:29.583 に答える
2

CouchDB でのビューのビュー照合を検討しましたか? これにより、db.view(..) 呼び出しの数を減らし、必要なすべてのデータを 1 つのビュー クエリで返すことができます。1 対多の場合は非常に簡単です (つまり、「人」には多くの「アイテム」があります)。複数のレベルではもう少し手間がかかるかもしれませんが、同じように機能するはずです。Couch ビューの照合に関する優れた記事がいくつかあります。

CouchDB の参加

CouchDB ビューの照合

于 2012-02-16T16:40:50.410 に答える
2

私が知っている最善の解決策は、promisesを使用することです。慣れるまで少し時間がかかりますが、努力する価値は十分にあります。Kris Kowal の Q-libraryを使用しています。彼はJSConf-2010 (15:30 にジャンプ)で、Q API と設計の優れたウォークスルーを提供しました。

于 2012-02-16T17:18:56.400 に答える
1

あなたはすでにここでいくつかの素晴らしい答えを得ています。

nano ソースコードから、役立つ例があります。

また、nodejs フロー制御がどのように機能するかを本当に理解していない場合は、このチュートリアルを参照することをお勧めできません。

ツールを使用するよりも、それがどのように機能するかを理解した上でツールを使用することをお勧めします :) おそらく、独自の制御フローをコーディングすることになるでしょう。

これが役に立てば幸いです。便宜上、コードを添付してください。

  var db    = require('nano')('http://localhost:5984/emails')
    , async = require('async')
    ;

  function update_row(row,cb) {
    var doc = row.doc;
    delete doc.subject;
    db.insert(doc, doc._id, function (err, data) {
      if(err)  { console.log('err at ' + doc._id);  cb(err); }
      else     { console.log('updated ' + doc._id); cb(); }
    });
  }

  function list(offset) {
    var ended = false;
    offset = offset || 0;
    db.list({include_docs: true, limit: 10, skip: offset}, 
      function(err, data) {
        var total, offset, rows;
        if(err) { console.log('fuuuu: ' + err.message); rows = []; return; }
        total  = data.total_rows;
        offset = data.offset;
        rows   = data.rows;
        if(offset === total) { 
          ended = true;
          return; 
        }
        async.forEach(rows, update_row, function (err) {
          if(err) { console.log('something failed, check logs'); }
          if(ended) { return; }
          list(offset+10);
        });
    });
  }

  list();
于 2012-02-17T11:52:32.887 に答える