Nie zapisująca się zmienna w klasie.

0

Mam koszyk zrobiony, wszystko pięknie działa, oprócz jednej rzeczy, mianowicie w koszyku mam różwniej .items, w którym znajdują się infromacje o produkcie dodanym do koszyka. np. dodaniekolejnego produktu, tego samego, do koszyka powduje NAN, kolejne już działa porawnie i wypisuje porawne amount. Nie rozumiem co się dzieje.
{
title: "gothc",
price: 2311,3
//amount = 2
}
i chciałem dodać jeszcze ile sztuk danego produktu jest w koszyku, niestety dodanie tej zmiennej do obiektu powoduje dziwne zadchowanie.
console.log(this.items[data._id].amount) pokazuje 1, natomiast this.items[data._id] pokazuje zawartość bez tej zmiennej.

module.exports = function Cart(oldCart) {

  this.totalPrice = oldCart.totalPrice;
  this.totalAmount = oldCart.totalAmount;
  this.items = oldCart.items;

  this.addProduct = function(data){
    this.totalPrice += data.price;
    this.totalAmount += 1;

    if (!this.items[data._id]) {
      this.items[data._id] = data;
      this.items[data._id].amount = 1; ##########
    }
    else {
      this.items[data._id].amount += 1;
    }
    console.log(this.items[data._id].amount);
  }

}

moj routing

router.get('/addCartProduct/:id', function (req, res, next) {
  Product.findById(req.params.id, function (err, data) {
    if (!req.session.cart) {
      req.session.cart =  {
        totalPrice : 0,
        totalAmount: 0,
        items : {}
      }
    }
    var cart = new Cart(req.session.cart);
    cart.addProduct(data);
    
    req.session.cart = cart;
    res.redirect('/');
  });
// res.redirect('/');
});

Mam jeszcze jedno takie pytanie, którego nie rozumiem zachowania, dlaczego jeśli res.redirect('/') nie znajduje się w Product.findById(){}
to nie zapisuje mi zawartości koszyka w sesji, jeśli redirect jest w miejscy wskazanym powyżej, wykomentowanym

0

No zaraz mnie sz... trafi

  this.items[data._id]['amount'] = 1;
  console.log(this.items[data._id]['amount']);

Powie mi ktoś o co chodzi? w żaden sposób nie mogę przypisać tej zmiennej. takie wywoałnie powuduje wypsianie na ekran 1, ale wypisanie this.items nie zawiera zmiennej amount
console.log(Object.getPrototypeOf(this.items[data._id]).amount) podaje undefined..
Jakby się nie zapisało w obiekcie.

0

dodanie
var z = 1;
this.items.amount = z;

dodało na koniec obiektu poprawnie dodało tą zmienną.
ale nie o to mi chodzi.
Cchiałem je włożyć do this.items[data._id]

0

Dla mnie to wygląda tak, jakbyś przeoczył jakiś szczegół w swoim kodzie albo masz buga w oprogramowaniu.

Korzystam z Twojej funkcji Cart, do której dodałem na końcu wyświetlenie obiektu this.items:

function Cart(oldCart) { 
    this.totalPrice = oldCart.totalPrice;
    this.totalAmount = oldCart.totalAmount;
    this.items = oldCart.items;
 
    this.addProduct = function(data) {
        this.totalPrice += data.price;
        this.totalAmount += 1;
 
        if (!this.items[data._id]) {
            this.items[data._id] = data;
            this.items[data._id].amount = 1; 
        } 
        else {
            this.items[data._id].amount += 1;
        }
        console.log(this.items[data._id].amount);

        //linia kodu dodana przeze mnie
        console.log(this.items); 
    }
}

Utworzenie instancji Cart:

let cart = new Cart({
	totalPrice: 10,
	totalAmount: 0,
	items: {
		"some_id": {
			_id: "some_id",
			price: 10,
			amount: 20
		}
	}
});

Dodanie pierwszego produktu:

cart.addProduct({
	_id: "some_id",
	price: 10
});

Wynik w konsoli:
screenshot-20190125222457.png

Dodanie drugiego produktu:

cart.addProduct({
	_id: "other_id",
	price: 20
});

Wynik w konsoli:
screenshot-20190125222559.png

Wygląda w porządku. Nawet jeśli wartość amount nie jest zdefiniowana w obiekcie oldCart, to i tak widzę tą właściwość w konsoli, tylko że ma wartość NaN - prawidłowo w tym przypadku.

0

Rozwiązałem problem...
Mogłem posłuchać głosu serca mego... ale tego nie zroibłem, a jednak to o to chodziło
Musiałem użyć funkcji Product.findById(req.params.id).lean() w moim kodzie, aby zmaienić mongojs na js.

1 użytkowników online, w tym zalogowanych: 0, gości: 1