我是新手。我正在尝试设置一个通过以下路线触发的计时器。这是购物车,在一定时间过后,购物车将被清空。
setTimeout调用一个名为timer的函数。当时间过去后,我遇到错误无法读取未定义的属性'session'。为什么计时器功能没有通过req.session?它正好通过我所有的路线。
app.js
td
路线
app.use(function(req, res, next){
res.locals.login = req.isAuthenticated();
res.locals.session = req.session; //global variable for session.
next();
});
答案 0 :(得分:0)
我会回答您的字面问题(即使您可能会针对您的问题决定不同类型的解决方案)。
您可以通过几种不同的方式访问计时器中的会话对象:
制作一个通过会话的存根函数:
Prod.findById(prodId, function(err, prod){
if (err) {
return res.redirect('/');
}
cart.add(prod, prod.id);
setTimeout(function() {
timer(req.session);
}, 20000);
req.session.cart = cart;
res.redirect('/show/' + prodId);
} else {
return res.redirect('/');
}
});
function timer(session) {
// do what you want to with the session
}
使用.bind()
将会话传递给您的回调:
Prod.findById(prodId, function(err, prod){
if (err) {
return res.redirect('/');
}
cart.add(prod, prod.id);
setTimeout(timer.bind(null, req.session), 20000);
req.session.cart = cart;
res.redirect('/show/' + prodId);
} else {
return res.redirect('/');
}
});
function timer(session) {
// do what you want to with the session
}
向setTimeout()
电话添加参数(setTimeout的一项功能):
Prod.findById(prodId, function(err, prod){
if (err) {
return res.redirect('/');
}
cart.add(prod, prod.id);
setTimeout(timer, 20000, req.session);
req.session.cart = cart;
res.redirect('/show/' + prodId);
} else {
return res.redirect('/');
}
});
function timer(session) {
// do what you want to with the session
}
创建匿名内联回调:
Prod.findById(prodId, function(err, prod){
if (err) {
return res.redirect('/');
}
cart.add(prod, prod.id);
setTimeout(function() {
// put your timer code here
// it can directly access req.session here
console.log(req.session);
}, 20000);
req.session.cart = cart;
res.redirect('/show/' + prodId);
} else {
return res.redirect('/');
}
});
P.S。如果你确实使用了一个计时器,你应该将timerID存储在会话中,每当你想设置一个新的计时器时,你可以在前一个计时器上调用clearTimeout()
以防止它被触发,然后将新的timerId分配给会话。