学习使用eventproxy解决深层回调函数时遇到的问题
众所周知eventproxy是一个解决深层回调函数的一个模块。我用的时候出现了这个问题:Error: db object already connecting, open cannot be called multiple times
参考他的readMe的例子
var ep = EventProxy.create("template", "data", "l10n", function (template, data, l10n) {
_.template(template, data, l10n);
});
$.get("template", function (template) {
// something
ep.emit("template", template);
});
$.get("data", function (data) {
// something
ep.emit("data", data);
});
$.get("l10n", function (l10n) {
// something
ep.emit("l10n", l10n);
});
似乎是因为我的get方法里面用了mongodb.open()这样的方法造成的不能多次打开数据库问题 我的代码:
var render = function (user, blogs) {
res.render("user", {title:user.name, blogs:blogs});
}
EventProxy.create("user", "blogs", render);
User.get(req.params.user, function (err, user) {
if (!user) {
req.flash("error", "用户不存在");
return res.redirect("/");
}
proxy.emit("user", user);
});
Blog.get(req.params.user, function (err, blogs) {
if (err) {
req.flash("error", err);
return res.redirect("/");
}
proxy.emit("blogs", blogs);
});
Blog.get 代码:
Blog.get = function get(username, callback) {
mongodb.open(function (err, db) {
if (err) {
return callback(err);
}
// 讀取 blogs 集合
db.collection('blogs', function (err, collection) {
//处理
});
});
};
User.get代码
User.get = function (username, callback) {
db.open(function (err, db) {
if (err) {
return callback(err);
}
db.collection("users", function (err, collection) {
//处理
});
});
}
这个有什么好的解决办法吗?好像因为读取数据库造成的深层回调事件好像还蛮多的
5 回复
db应该是个单实例。实例内做连接池
db.open(function(err, db){
var render = function (user, blogs) {
db.close();
res.render("user", {title:user.name, blogs:blogs});
}
EventProxy.create("user", "blogs", render);
User.get(req.params.user, function (err, user) {
if (!user) {
req.flash("error", "用户不存在");
return res.redirect("/");
}
proxy.emit("user", user);
});
Blog.get(req.params.user, function (err, blogs) {
if (err) {
req.flash("error", err);
return res.redirect("/");
}
proxy.emit("blogs", blogs);
});
});
User.get = function (username, callback) {
db.collection("users", function (err, collection) {
//处理
});
}
把db.open放在最外面,然后在render的时候关闭
感觉一楼的方案比较好点,性能好点也比较灵活使用。
db打开了就不用关闭。因为node跟db的连接一直存在。不停打开关闭,性能并不好。