1

2つのモデルがデータベースに追加された後、誰かがデータベースを閉じるのを手伝ってもらえますか?読んでみました

http://howtonode.org/intro-to-jake

Node.jsとJake-タスク内でシステムコマンドを同期的に呼び出す方法は?

およびgithubreadme( https://github.com/mde/jake)

しかし、それでもそれを理解できないようです。これがreadmeからの抜粋です

すべてのタスクの実行後のクリーンアップ、jake'complete'イベントベースの'jake'オブジェクトはEventEmitterであり、すべてのタスクの実行後に'complete'イベントを発生させます。これは、タスクがノードイベントループの実行を維持するプロセス(データベース接続など)を開始するときに役立つ場合があります。すべてのタスクが終了した後に実行中のNodeプロセスを停止することがわかっている場合は、次のように「complete」イベントのリスナーを設定できます。

jake.addListener('complete', function () {
  process.exit();
});

現在のように、接続を開く前に接続を閉じています。

// db connect
var db = require('./schema');

desc('Seed MongoDB with initial data');
task('seed', [], function () {

    //******* Populate the database
    var user1 = new db.userModel({ email: 'x@x.com', password: 'x', phone: x });
    user1.save(function(err) {
        if(err) {
            console.log(err);
        } else {
            console.log('user: '+user1.email +' saved');
        }
    });
    var user2 = new db.userModel({ email: 'x', password: 'x', phone: x });
    user2.save(function(err) {
        if(err) {
            console.log(err);
        } else {
            console.log('user: '+user2.email +' saved');
        }
    });

    db.mongoose.connection.close();
    console.log('Closed mongodb connection');
});

編集: parseqモジュールからの並列フローを使用して目的を達成することができました。

par(
  function() {
    fs.readFile("file1", this);
  },
function() {
  fs.readFile("file2", this);
},
function done(err, results) {
  ...
}
);

Edit2: それで私は本当にすべての助けに感謝します。また、あなたがparseqのメンテナーであるのを見ました:)。そのためのThx!私はまだこの最後のビットに苦労していて、関数5が完了したときに関数がハングし、done()を呼び出さない。私は「これ」を間違って呼んでいると確信しています。何かアドバイス?

seq(
    function f1() {
        var user = new db.userModel({ email: 'x'
                        , password: 'x'
                        , phone: x });
        user.save(this);
    }, 
    function f2(err, value) {
        var user = new db.userModel({ email: 'x'
                        , password: 'x'
                        , phone: x });
        user.save(this);
    }, 
    function f3(err, value) {
        var merchant = new db.merchantModel({ name: 'x'
                        , logourl: 'x' });
        merchant.save(this);
    }, 
    function f4(err, value) {
        var merchant = new db.merchantModel({ name: 'x'
                        , logourl: 'x' });
        merchant.save(this);
    }, 
    function f5(err, value) {
        db.merchantModel.findOne({ name: 'x' }, function(err, merchant) {
            var coupon = new db.couponModel({ merchant_id: merchant.id
                            , name: 'x'
                            , imageurl: 'x'
                            , expiration: Date.UTC(2013,3,15) });
                            //, expiration: new Date(2013,3,15) }); //alternate date creation method
            coupon.save(this);
        });
    }, 
    function done(err) {
        if(err) {
            console.log(err);
        } else {
            console.log('successfully seeded db');
        }
        db.mongoose.connection.close();
        console.log('Closed mongodb connection');
    }
);
4

1 に答える 1

1

db.mongoose.connection.close両方の保存機能が完了した後で呼び出す必要があります。最も簡単なのは、保存呼び出しをネストすることです(ただし、最もきれいではありません)。

var user1 = new db.userModel({ email: 'x@x.com', password: 'x', phone: x });
user1.save(function(err) {
    if(err) {
        console.log(err);
    } else {
        console.log('user: '+user1.email +' saved');
    }
    var user2 = new db.userModel({ email: 'x', password: 'x', phone: x });
    user2.save(function(err) {
        if(err) {
            console.log(err);
        } else {
            console.log('user: '+user2.email +' saved');
        }
        db.mongoose.connection.close();
        console.log('Closed mongodb connection');
    });
});

次に、コードを単純化するために、フロー制御ライブラリの調査を開始する必要があります。

パーセクを使用して同じこと:

var seq = require("parseq").seq;

seq(
  function f1() {
    var user1 = new db.userModel({ email: 'x@x.com', password: 'x', phone: x });
    user1.save(this);
  }, function f2(err, value) {
    var user2 = new db.userModel({ email: 'x', password: 'x', phone: x });
    user2.save(this);
  }, function done(err) {
    // check err here
    console.log('Closed mongodb connection');
  }
);

一部のエラーを選択的に無視するために、1つの関数は次のようになります。

function f1() {
    var self = this;
    var user1 = new db.userModel({ email: 'x@x.com', password: 'x', phone: x });
    user1.save(function(err) {
      if (err === SOMETHING_TO_IGNORE) {
        self(null);
      else {
        self(err);
      }
    });
  }
于 2013-02-05T22:43:46.213 に答える