Я пытаюсь сохранить цены продуктов в сеансах, и если продукт щелкается дважды, цена должна быть добавлена и показана в сеансе, но по какой-то причине, когда я пытаюсь добавить два числа, например 15 + 15, это добавляет как 01515, я не уверен, почему это происходит.

Вот файл .hbs, с которого начинается добавление продукта.

{{# each products}}
    <div class="row">
        {{# each this}}
            <div class="col-sm-6 col-md-4">
                <div class="thumbnail">
                    <img src="{{this.imagePath}}" alt="..." class="img-responsive">
                    <div class="caption">
                        <h3>{{this.title}}</h3>
                        <p>{{this.description}}</p>
                        <div class="clearfix">
                            <div class="price pull-left">${{this.price}}</div>
                            <a href="/add-to-cart/{{this._id}}" class="btn btn-sucess pull-right" role="button">Add to cart</a>
                        </div>
                    </div>
                </div>
            </div>
        {{/each}}
    </div>
{{/each}}

После нажатия кнопки «Добавить в корзину» здесь отображаются маршрут и модель,

< Сильный > путь

router.get('/add-to-cart/:id', function(req, res, next) {
    var productId = req.params.id;
    var cart = new Cart(req.session.cart ? req.session.cart : {});

    Product.findById(productId, function(err, product) {
        if (err) {
            return res.redirect('/');
        }
        cart.add(product, product.id);
        req.session.cart = cart;
        console.log(req.session.cart);
        res.redirect('/');
    });
});

Модель

module.exports = function Cart(oldCart) {
    this.items = oldCart.items || {};
    this.totalQty = oldCart.totalQty || 0;
    this.totalPrice = oldCart.totalPrice || 0;

    this.add = function(item, id) {
        var storedItem = this.items[id];
        if (!storedItem) {
            storedItem = this.items[id] = {item: item, qty: 0, price: 0};
        }
        storedItem.qty++;
        storedItem.price = storedItem.item.price * storedItem.qty;
        this.totalQty++;
        this.totalPrice += storedItem.item.price;
    };


    this.generateArray = function() {
        var arr = [];
        for (var id in this.items) {
            arr.push(this.items[id]);
        }
        return arr;
    };
};

Я попытался войти в консоль, чтобы увидеть, что происходит при добавлении чисел, это показывает, как это

    Cart {
  items: 
   { '5855c55482d8722419e21a7d': { item: [Object], qty: 1, price: 15 },
     '5855c55482d8722419e21a7f': { item: [Object], qty: 1, price: 15 } },
  totalQty: 2,
  totalPrice: '01515',
  add: [Function],
  reduceByOne: [Function],
  removeItem: [Function],
  generateArray: [Function] }

Я очень новичок в узле JS, и я не уверен, что с этим не так.

0
Masnad Nihit 12 Янв 2017 в 23:37

3 ответа

Лучший ответ

В вашем модуле измените эту строку

this.totalPrice = oldCart.totalPrice || 0;

Быть чем-то вроде этого

this.totalPrice = parseInt(oldCart.totalPrice, 10) || 0;

Вы также должны изменить

this.totalPrice += storedItem.item.price;

Быть чем-то вроде

this.totalPrice += parseInt(storedItem.item.price);

Проблема здесь в том, что и this.totalPrice, и storedItem.item.price являются строками, когда вы впервые получаете его по вашему запросу - this.totalPrice является строкой, потому что oldCart.totalPrice вернется к вам в виде строки ,

Это вызывает принуждение вашего storedItem.item.price к строке, когда вы складываете их вместе:

this.totalPrice += storedItem.item.price;
// string += string => concatenated string
1
Nick Zuber 12 Янв 2017 в 20:51

Oldcart.totalPrice выдаст вам строку, поэтому значение будет объединено. вместо того {{Х0}}

Вы могли бы использовать

this.totalPrice = Number(oldCart.totalPrice) || 0;

1
Masnad Nihit 12 Янв 2017 в 20:52

Кажется, вы согласны со строковым значением! попытайтесь привести / вызвать тип integer, прежде чем выполнять какие-либо математические действия

const string1 = '123'
const string2 = '233'

console.log(string1 + string2)     //123233

console.log(parseInt(string1) + parseInt(string2))     //356

Всегда проверяйте, если ваш parseInt не возвращает NaN;)

1
Masnad Nihit 12 Янв 2017 в 22:13