Синхронное задание Jake Node.js

Может ли кто-нибудь помочь мне с закрытием базы данных после добавления двух моделей в базу данных? Я пробовал читать

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

Node.js и Джейк - Как синхронно вызывать системные команды внутри задачи?

и readme с github по адресу https://github.com/mde/jake

но все еще не могу понять это. Вот выдержка из readme

Очистка после выполнения всех задач, событие jake "complete" Базовый объект "jake" является EventEmitter и запускает событие "complete" после выполнения всех задач. Это иногда полезно, когда задача запускает процесс, который поддерживает цикл событий Node (например, соединение с базой данных). Если вы знаете, что хотите остановить запущенный процесс 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:). Спасибо за это! Я все еще борюсь с этим последним битом, и моя функция зависает и не вызывает done(), когда функция 5 завершена. Я уверен, что я называю это неправильно. Любой совет?

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');
    }
);

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');
    });
});

Затем вы должны начать изучать библиотеку управления потоком, чтобы сделать ваш код проще.

то же самое, используя parseq:

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');
  }
);

чтобы выборочно игнорировать некоторые ошибки, вот как может выглядеть одна функция:

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);
      }
    });
  }
Другие вопросы по тегам