1

私はasync.jsを使用して、コレクションに対してforループを実行しています。パフォーマンス上の理由から、データベース接続をイテレータメソッドに渡して、イテレータが実行されるたびにdb接続を開いたり閉じたりしないようにします。データモデルにmongoose.jsを使用しています。

以下のコードは、mongoのすべてのアーティストを取得し、それぞれに曲を追加します。私の質問は、addArtistSongのupdateAllArtistsから同じdb接続をどのように使用できるかということです。

function updateAllArtists() {
    var db = mongoose.createConnection('localhost/dbname');
    var Artist = db.model('Artist', artistSchema);
    Artist.find({}, function(err, artists) {
       // for each artist, add a song
       async.forEach(artists, addArtistSong, function(err) {
    });
}

function addArtistSong(artist, cb) {
    // THIS IS WHERE I NEED A DB CONNECTION
    var Song = db.model('Song', songSchema);
}

addArtistSong(artist、db、cb)のように、イテレータ署名を何らかの方法で拡張できますか?次に、forEach呼び出しからこれをどのように渡しますか?

4

1 に答える 1

2

1つのオプションは、db接続をグローバル変数にすることです。ただし、それを望まない場合は、いつでもクロージャを使用して関数間で共有変数を作成できます。

(function(){
  // create db in this closure
  var db = mongoose.createConnection('localhost/dbname');

  function updateAllArtists() {
    // now db is available here
    var Artist = db.model('Artist', artistSchema);
    Artist.find({}, function(err, artists) {
      // for each artist, add a song
      async.forEach(artists, addArtistSong, function(err) {});
    });
  }

  function addArtistSong(artist, cb) {
    // and also available here
    var Song = db.model('Song', songSchema);
  }
})()

もう1つのオプションは、パラメーターとしてに渡すことaddArtistSongです。イテレータ関数が2つのパラメーターのみを受け入れることを期待しているためasync.forEach、無名関数ラッパーを使用して3つのパラメーターを以下に渡すことができますaddArtistSong

function addArtistSong(db,artist,callback) {
    db.model(); //...
}

そしてそれを呼び出すasync.forEach

async.forEach(
  artists,
  function(x,cb){addArtistSong(db,x,cb)},
  function(err) {}
);
于 2012-11-30T03:55:41.207 に答える