Синхронное задание 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);
}
});
}