gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:09:18 26 4
gpt4 key购买 nike

我将 Node.js 与 Express 结合使用,并将与此类似的代码作为我的路线的一部分:

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

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

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

非常感谢。

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

最佳答案

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();
});

};

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

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

关于node.js - 延迟事件直到调用回调 (Node.js),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5915009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com