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

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

回到顶部