【问题标题】:Stumped implementing express-session variables as an array难以将快速会话变量实现为数组
【发布时间】:2015-11-20 04:18:19
【问题描述】:

在这里尝试了解 Express。我正在使用 express-session 模块,当我使用对象或字符串的会话变量时我没有遇到任何问题。但是,我似乎无法让数组工作。我正在使用购物车技术作为实验室老鼠。这是导致我出现问题的代码:

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。随后的“添加到购物车”点击不会更新该值。

请指教。

【问题讨论】:

    标签: javascript node.js express


    【解决方案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数组的长度。

    【讨论】:

    • 这似乎不起作用。我试过了,itemsInCart 一直为 0 不会更新。
    • 这意味着负责更新的那段代码在添加项目后没有运行,请提供更多关于这个 itemsInCart 变量的定义位置的信息?
    • 我已经编辑了我的问题,添加了所有相关代码。请检查一下。
    • if 语句中的变量如果为真,则存在于 if 语句之外。可能想改写最后一部分。
    • @BenFortune,谢谢,尝试了更好的,希望对您有所帮助。
    【解决方案2】:

    嗯,经过多次迭代,我终于让它工作了:

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

    我只是不知道为什么我之前没有想到这一点。一定是我的糟糕日子之一。

    【讨论】:

      猜你喜欢
      • 2018-03-14
      • 2014-11-08
      • 1970-01-01
      • 2015-07-05
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多