gpt4 book ai didi

node.js - 同步 Jake Node.js 任务

转载 作者:太空宇宙 更新时间:2023-11-04 01:12:55 25 4
gpt4 key购买 nike

有人可以帮我在将两个模型添加到数据库后关闭数据库吗?我尝试过阅读

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

但似乎还是想不通。这是自述文件的摘录

所有任务运行后进行清理, jack “完成”事件基本的“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) {
...
}
);

编辑2:所以我真的很感谢所有的帮助。我还看到你是 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');
}
);

最佳答案

在两个保存函数完成后,您需要调用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);
}
});
}

关于node.js - 同步 Jake Node.js 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14717119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com