2017-01-12 4 views
0

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

Вот файл .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, и я не уверен, что с этим происходит.

ответ

1

В модуле, измените эту строку

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 
+0

Я думал, что этот ответ может работать, но это не так, к сожалению. Я сейчас очень смущен. –

+0

@MasnadNihit см. Мой обновленный ответ - я думаю, что обе переменные на самом деле являются строками, поэтому нам нужно сделать их номерами –

+0

Спасибо большое! Это сработало! Если все в порядке, я хотел бы задать вам два вопроса. 1) oldCart.totalЦена, 10 <- Что делают 10. 2) Есть ли способ отладить эти проблемы? Я не уверен, что console.log можно использовать в таких ситуациях? –

1

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

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

console.log(string1 + string2)  //123233 

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

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

+0

Спасибо за комментарий, но это не так. помогите мне понять, какую ошибку я совершил. Не могли бы вы помочь мне таким образом, чтобы вы сказали мне, как это исправить? Цените его. –

1

oldcart.totalPrice будет давать вам строку, так что значение получает сцепляются. вместо this.totalPrice = oldCart.totalPrice || 0;

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

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