具有节点快递的倒数计时器。无法访问req.session

时间:2018-04-07 23:59:17

标签: node.js express

我是新手。我正在尝试设置一个通过以下路线触发的计时器。这是购物车,在一定时间过后,购物车将被清空。

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

1 个答案:

答案 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分配给会话。