Ошибка приведения к номеру для значения «NaN» - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь прибавить к общей стоимости своей корзины, но получаю эту ошибку. Вот соответствующая модель пользователя:

const mongoose = require('mongoose');

const Schema = mongoose.Schema;

const userSchema = new Schema({
  name: {
    type: String, 
    required: true
  },
  email: {
    type: String,
    required: true
  },
  cart: {
    items: [{
      productId: { type: Schema.Types.ObjectId, ref: 'Product', required: true }, 
      quantity: { type: Number, required: true }
    }],
    totalPrice: { type: Number, default: 0, required: true }
  }
});

userSchema.methods.addToCart = function(product) {
    const cartProductIndex = this.cart.items.findIndex(cp => {
      return cp.productId.toString() === product._id.toString(); 
    });

    let newQuantity =1;
    const updatedCartItems = [...this.cart.items];

    if (cartProductIndex >= 0) {
      newQuantity = this.cart.items[cartProductIndex].quantity + 1;
      updatedCartItems[cartProductIndex].quantity = newQuantity;
    } 

    else {
      updatedCartItems.push({
        productId: product._id, 
        quantity: newQuantity});
    }


    //updatedTotalPrice = updatedTotalPrice + prodPrice;

    const updatedCart = { 
      items: updatedCartItems
      };

      this.cart = updatedCart;
      this.cart.totalPrice += product.price;
     return this.save();
}

module.exports = mongoose.model('User', userSchema);

Вот ошибка, с которой я сталкиваюсь:

Error [ValidationError]: User validation failed: cart.totalPrice: Cast to Number failed for value "NaN" at path "cart.totalPrice"
    at ValidationError.inspect (C:\Users\Bhowal Soham\Desktop\NODE_Project\node_modules\mongoose\lib\error\validation.js:61:24)
    at formatValue (internal/util/inspect.js:563:31)
    at inspect (internal/util/inspect.js:221:10)
    at formatWithOptions (internal/util/inspect.js:1693:40)
    at Object.Console.<computed> (internal/console/constructor.js:272:10)
    at Object.log (internal/console/constructor.js:282:61)
    at C:\Users\Bhowal Soham\Desktop\NODE_Project\controllers\shop.js:69:25
    at processTicksAndRejections (internal/process/task_queues.js:93:5) {
  errors: {
    'cart.totalPrice': MongooseError [CastError]: Cast to Number failed for value "NaN" at path "cart.totalPrice"
        at new CastError (C:\Users\Bhowal Soham\Desktop\NODE_Project\node_modules\mongoose\lib\error\cast.js:29:11)
        at model.$set (C:\Users\Bhowal Soham\Desktop\NODE_Project\node_modules\mongoose\lib\document.js:1236:9)
        at Document.set [as totalPrice] (C:\Users\Bhowal Soham\Desktop\NODE_Project\node_modules\mongoose\lib\helpers\document\compile.js:148:26)    
        at model.userSchema.methods.addToCart (C:\Users\Bhowal Soham\Desktop\NODE_Project\models\user.js:50:28)
        at C:\Users\Bhowal Soham\Desktop\NODE_Project\controllers\shop.js:63:21
        at processTicksAndRejections (internal/process/task_queues.js:93:5) {
      stringValue: '"NaN"',
      kind: 'Number',
      value: NaN,
      path: 'cart.totalPrice',
      reason: [MongooseError],
      message: 'Cast to Number failed for value "NaN" at path "cart.totalPrice"',
      name: 'CastError'
    }
  },
  _message: 'User validation failed',
  name: 'ValidationError'
}

Я не совсем понимаю точку "NaN" моей ошибки. Я имею в виду, что я прочитал go через кучу похожих сообщений на эту тему, и у большинства из них возникла проблема не устанавливать по умолчанию значение 0, что я и сделал в своем определении схемы. Также в файле приложения. js я инициализирую массив элементов корзины и totalPrice с пустыми значениями и 0, так что это не является причиной моей проблемы.

Примечание: имя пользователя и пароль были изменены в строке подключения для конфиденциальности, проблема не с ними.

mongoose.connect('mongodb+srv://Username:<password>@nodeproject-37zzb.mongodb.net/shop?retryWrites=true&w=majority', {
  useNewUrlParser: true,
  useUnifiedTopology: true
})
  .then(result => {
  User.findOne().then(user => {
    if (!user) {
      const user = new User({
        name: 'Max',
        email: 'test@test.com',
        cart: {
          items: [],
          totalPrice: 0
        }
      });
      user.save();
    }
  });
  app.listen(3000);
}).catch(err => console.log(err));

Есть предложения относительно того, что может быть не так?

...