我正在使用带有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表示没有适用于我的解决方案。
答案 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();
});
};
我认为你真正想要的是某种消息缓存。现在这是一个模糊的概念证明。你真正想要的东西取决于你的代码。
如果您有任何类型的延迟库/抽象可用,那么代码将变得更小。