Я новичок в этом. Я пытаюсь настроить таймер, который запускается по указанному ниже маршруту. Это для корзины покупок, где корзина будет опорожнена по прошествии определенного времени.
setTimeout вызывает функцию с именем timer. По истечении времени я сталкиваюсь с ошибкой Не удается прочитать «сеанс» свойства неопределенного. Почему функция таймера не передает req.session? Он проходит нормально по всем моим маршрутам get.
app.js
app.use(function(req, res, next){
res.locals.login = req.isAuthenticated();
res.locals.session = req.session; //global variable for session.
next();
});
Маршруты
router.get('/add/:id', function(req, res, next){
var prodId = req.params.id;
var cart = new Cart(req.session.cart ? req.session.cart : {})
Prod.findById(prodId, function(err, prod){
if (err) {
return res.redirect('/');
}
cart.add(prod, prod.id);
setTimeout(timer, 20000);
req.session.cart = cart;
res.redirect('/show/' + prodId);
} else {
return res.redirect('/');
}
});
});
var timer = function(req, res){
console.log(req.session.cart);
};
вы не передаете
req
иres
таймеру.. должно бытьsetTimeout(timer, 20000, req, res);
Хотя я не буду рекомендовать это делать, этоsetTimeout
укусит вас позже...Ах хорошо. почему бы вам не порекомендовать этот метод?
Вы сохраняете объект запроса и ответа после того, как запрос ушел. Если вы хотите очистить сессию через какое-то время, лучше добавьте время последней активности и проверьте в следующем запросе, если пользователь какое-то время был неактивен, уничтожьте сессию.
на самом деле, это оставляет меня с одной небольшой проблемой. причина, по которой я хотел использовать таймер, заключалась в том, что мне нужно вернуть предмет в инвентарь. если пользователь добавляет в корзину, но больше ничего не делает (например, больше не просит), то нет другого способа вернуться в инвентарь?
Ну, есть несколько способов, корзина живет только в сеансе или у вас есть база данных? Если у вас есть корзина, сохраненная в БД, вы можете периодически удалять просроченные корзины из БД и возвращаться в инвентарь.
очень интересно. тележка живет в сеансе, но БД может иметь больше смысла. просто читаю о TTL в mongoDB сейчас. еще раз спасибо