在将两个模型添加到数据库后,有人可以帮我关闭数据库吗?我试过读
http://howtonode.org/intro-to-jake
Node.js and Jake - How to call system commands synchronously within a task?
和github自述文件 https://github.com/mde/jake
但似乎仍无法弄明白。以下是自述文件的摘录
在所有任务运行后进行清理,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 :)的维护者。谢谢!我仍在努力完成这最后一点,我的功能是悬挂,而不是在功能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');
}
);
答案 0 :(得分: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);
}
});
}