【问题标题】:Delaying events until a callback is called (Node.js)延迟事件直到调用回调(Node.js)
【发布时间】:2011-08-20 09:02:34
【问题描述】:

我正在使用带有 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 方法正在访问数据库。问题是,我绑定的请求“数据”事件永远不会被触发。似乎数据事件在用户从数据库返回时已经被触发和处理,现在对它做任何事情都为时已晚。在上面的示例中,我可以将 req.addListener 移动到数据库回调之外,但实际上我在这里调用了 next() ,它不能移动。

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

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

非常感谢。

编辑:我找到了relevant discussion in the nodejs Google group,这表明没有适合我的解决方案。

【问题讨论】:

  • 解释为什么不能将req 向上移动。举一个更具体的例子。
  • @Raynos:我添加了“next()”函数调用,这实际上是我真实代码中的问题所在。我还在第二段中对此进行了扩展。

标签: node.js express


【解决方案1】:
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();
    });

};

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

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

【讨论】:

  • 谢谢,这在某些情况下可行,但我不能使用这样的缓存,因为 next() 函数调用的代码使用直接绑定到“数据”事件的外部库。看起来这是一个目前没有好的解决方案的问题:Google groups discussion
  • @JamesAllen 您的问题是在数据提交后绑定到数据事件。
猜你喜欢
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 2020-10-21
相关资源
最近更新 更多