延迟事件直到调用回调(Node.js)

时间:2011-05-06 17:39:18

标签: node.js express

我正在使用带有Express的Node.js,并且我的路由中包含与此类似的代码:

requireLogin: function(req, res, next) {
    User.find(req.session.userId)
        .on('success', function(user) {
             req.addListener('data', function(chunk) {
                 console.log("DATA: " + chunk);
             }
             next()
        }
}

我正在使用Sequelize,而User.find方法正在访问数据库。麻烦的是,我绑定的请求'data'事件永远不会被触发。似乎数据事件已经在用户从数据库返回时被触发和处理,并且对它做任何事情都为时已晚。在上面的例子中,我可以将req.addListener移动到数据库回调之外,但实际上我在这里调用next(),这是无法移动的。

next()调用的所有以下路由中间件都无法访问请求数据,因为这些事件已被触发。更糟糕的是,他们只是等待来自req的数据事件,因为它已经发生了。

我怎么能以某种方式延迟数据事件,以便它可以从数据库回调中绑定?或者我误解了一些基本的东西,需要改变我的方式吗?

非常感谢。

编辑:我发现relevant discussion in the nodejs Google group表示没有适用于我的解决方案。

1 个答案:

答案 0 :(得分:0)

var cache = new function () {
    var arr = [],
        cbs = [];

    this.add = function(data) {
        arr.push(data);
        cbs.forEach(function(cb) {
            cb(arr);
        });
    }

    this.get = function(cb) {
        cbs.push(arr);
        if (arr.length > 0) {
            cb(arr);
        }
    }
};

req.addListener('data', function(chunk) {
    cache.add(chunk);
};

User.find(
    req.session.userId
).on('success', function(user) {
    cache.get(function(data) {
        // stuff
        next();
    });

};

我认为你真正想要的是某种消息缓存。现在这是一个模糊的概念证明。你真正想要的东西取决于你的代码。

如果您有任何类型的延迟库/抽象可用,那么代码将变得更小。