学习使用eventproxy解决深层回调函数时遇到的问题 - CNode技术社区

学习使用eventproxy解决深层回调函数时遇到的问题
发布于 13 年前 作者 duyinghua 7496 次浏览 最后一次编辑是 9 年前

众所周知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的连接一直存在。不停打开关闭,性能并不好。

回到顶部

AltStyle によって変換されたページ (->オリジナル) /