2017-02-05 8 views
0

NodeJSを使用して、大規模な製品コレクションを繰り返し処理しています。 MongoDbネイティブドライバが使用されます。すべては問題ありませんが、すべての文書が処理された後にファイルにフッター行を書きたいと思います。どのように私はこれを達成することができますか?カーソルforeach関数の実行後にコールバックを起動しますか?

var MongoClient = require('mongodb').MongoClient 
var assert = require('assert'); 
var filename = '/tmp/' + feed.outputFilename; 
fs.writeFileSync(filename, feed.header, feed.encoding, function(err) { 
    if(err) throw err; 
}); 

var url = process.env.DB_HOST; 
MongoClient.connect(url, function(err, db) { 
    assert.equal(null, err); 

    var collection = db.collection('products'); 
    var cursor = collection.find({ "catalog": "electronics"}, { "batchSize": 1,fields: {} }).forEach(function(product) { 
     if(product != null) { 
      var child = workers[Math.floor(Math.random()*workers.length)]; 
      var data = {}; 
      data.product = product; 
      data.feed = feed; 
      child.send(data); 
     } 
    }, function(err) { 
     assert.equal(null, err); 
     db.close(); 
    }); 

    // This doens't work for me (Error: Connot read property 'on' of undefined) 
    /*cursor.on('end', function() { 
     fs.appendFile('/tmp/' + filename, feed.footer, function(err) { 
      if(err) throw err; 
     }); 

     db.close(); 
    })*/ 
}); 

答えて

0

は、おそらくここで起こって何ができるかvaluecursorvarに割り当てられているforEachにあなたの呼び出しから返されたということです。

valueを割り当てる試しはcursorvarfindから返され、後でcursor.forEachとしてforEachcursor.onを呼び出します。

+0

これを実現するために、mongoストリームインターフェイスを使用する関数を再構築しました。私はカーソル自体が終了イベントを発生させないと思います。 – Xaptor

関連する問題