Прерывистая реализация переменных express-сессии в виде массива

Попытайтесь бросить express здесь. Я использую модуль express-сессии, и у меня не было проблем, когда я использую переменные сеанса, которые являются объектами или строками. Тем не менее, я просто не могу заставить массивы работать. Я использую технику корзины в качестве лабораторной крысы. Вот код, который вызывает у меня проблемы:

router.post('/', function(req, res) { if (req.body.action == 'Add to Cart') { var cart = req.session.cart = []; cart.push(req.body.itemId); res.redirect('/'); } }); router.get('/', function(req, res) { if (req.session.cart) { var itemsInCart = req.session.cart.length; } res.render('index', { title: 'Shopping Spree', itemsInCart: itemsInCart, products: [ {id: 1, item: 'Boeing 747', price: 4500}, {id: 2, item: 'Luxury Yacht', price: 200}, {id: 3, item: 'Mercedes AMG GT', price: 15000}, {id: 4, item: 'Apple iPhone 6', price: 2400}, {id: 5, item: 'Moet Hennessey', price: 5000} ] }); }); 

И в представлении: index.jade :

 extends layout block content h2= title p Cart(#{itemsInCart} items) a(href="/cart") [VIEW CART] table thead tr th Item th Price tr tbody - for (var i in products) { tr td= products[i].item td= products[i].price td form(action="/", method="post") input(type="hidden", name="itemId" value="#{products[i].id}") input(type="submit", name="action", value="Add to Cart") - } 

При первом нажатии кнопки «Добавить в корзину» itemsInCart действительно обновляются до 1. Последующие клики «Добавить в корзину» не будут обновлять это значение.

Пожалуйста, порекомендуйте.

Используя эту строку

 var cart = req.session.cart = []; 

каждый раз, когда вы его вызываете, вы переопределяете содержимое req.session.cart на [].

Попробуйте вместо этого:

 var cart = req.session.cart || []; 

Он сохранит существующую стоимость cart и вы не потеряете предыдущие элементы

ОБНОВИТЬ

Что касается обновленного вопроса, вот что вы можете сделать, чтобы обновить привязки Jade:

 var pageScope; router.post('/', function (req, res) { if (req.body.action == 'Add to Cart') { var cart = req.session.cart = []; cart.push(req.body.itemId); pageScope.itemsInCart = req.session.cart && req.session.cart; res.redirect('/'); } }); router.get('/', function (req, res) { pageScope.itemsInCart = req.session.cart && req.session.cart; res.render('index', pageScope = { //... }); }); 

Идея заключается в обновлении itemsInCart , каждый раз, вы увеличиваете длину массива cart .

Ну, после многих, многих итераций, я, наконец, получил это для работы:

 router.get('/', function(req, res) { if (req.session.cart) { var itemsInCart = req.session.cart.length; } else { req.session.cart = []; } res.render('index', { title: 'Shopping Spree', itemsInCart: itemsInCart, //... }); }); 

затем

 router.post('/', function(req, res) { if (req.body.action == 'Add to Cart') { req.session.cart.push(req.body.itemId); res.redirect('/'); } }); 

Я просто не знаю, почему я не думал об этом раньше. Должно быть, это один из моих плохих дней.