Ошибка схемы мангуста: «тип» неопределенного

#javascript #node.js #mongoose #discord.js #mongoose-schema

Вопрос:

Мне нужна помощь в решении этой проблемы. Если я помещу 2 или более 2 в $guaranteedTier в своей базе данных, я получу эту ошибку «не удается установить свойство» тип « неопределенного. Но если это 1 гарантированный доллар, он работает нормально. Ошибка в строке 112: cardToAdd.type = ‘символ’; Что я мог сделать, чтобы решить эту проблему?

Моя Схема:

 const { model, Schema } = require('mongoose');
const Probability = require('probability-node');
const _ = require('lodash');

const cardPackSchema = new Schema({
    name: {
        type: String,
        unique: true
    },
    description: String,
    cards: Number, //Número de cartas dentro desse pack
    type: String, //Se é um Personagem, Feitiço, Item, Todos
    tier: Number,
    probability: {
        //Probabilidade de pegar cartas de especifico tier
        1: Number,
        2: Number,
        3: Number,
        4: Number,
        5: Number,
    },
    price: Number,
    discount: Number, //Desconto em porcentagem %
    stock: Number, // -1 é infinito no estoque
    guaranteedTier: Number //Se refere ao tier da descriçao do pack
});

cardPackSchema.methods.purchase = async function(memberID) {
    //->Initialization
    const profile = await this.model('Profile')
      .findOne({ memberID })
      .exec();
  
    //->Validation
    if (this.stock === 0)
      return {
        res: 'err',
        title: 'Not available',
        desc: 'The pack you are trying to purchase is out of stock'
      };
  
    if (profile.coins < this.price - this.price * this.discount)
      return {
        res: 'err',
        title: 'Insufficient Coins',
        desc: 'You do not have sufficient coins to purchase this pack'
      };
  
    //->Purchasing
    const cards = []; //Cards to give to the player;
  
    //-> Adding Guaranteed tier card
    if (this.guaranteedTier > 1) {
      addCard.call(this, this.guaranteedTier);
      this.cards--;
    }
  
    //->Probabilitized function
    const addRandomCard = new Probability(
      {
        p: this.probability['1'],
        f: () => addCard.call(this, 1)
      },
      {
        p: this.probability['2'],
        f: () => addCard.call(this, 2)
      },
      {
        p: this.probability['3'],
        f: () => addCard.call(this, 3)
      },
      {
        p: this.probability['4'],
        f: () => addCard.call(this, 4)
      },
      {
        p: this.probability['5'],
        f: () => addCard.call(this, 5)
      }
    );
  
    //-> Adding the rest of the cards
    for (var i = 1   cards.length; i <= this.cards; i  ) {
      await addRandomCard();
    }
  
    //->Add Cards to inventory
    const deck = await this.model('Deck')
      .findOne({ memberID })
      .exec();
  
    profile.deductCoins(this.price - this.price * this.discount);
  
    await deck.addCards(cards);
    //->Return card names
    return {
      res: 'success',
      cards,
      coins: profile.coins - (this.price - this.price * this.discount)
    };
  
    //->Add Card function
    async function addCard(tier) {
      const randomTypeCard = Math.floor(Math.random() * 1)   1;
  
      //Adding a Character card
      if (
        (randomTypeCard === 1 amp;amp; this.type === 'all') ||
        this.type === 'character'
      ) {
        const cardToAdd = _.sample(await model('Character').find({ tier }));
        cardToAdd.type = 'character';
        if (
          !_.includes(cards.map(card => card.name), cardToAdd.name) ||
          cardToAdd.sold >= cardToAdd.stock
        ) {
          await cardToAdd.sell();
          cards.push(cardToAdd);
        } else addCard.call(this, tier);
      }
    }


};

model('CardPack', cardPackSchema);
 

Комментарии:

1. Вы прочитали ошибку?

Ответ №1:

Я полагаю, что проблема Character в том, что в вашей базе данных нет документов запрошенного уровня (>= 2).

 await model('Character').find({ tier })
 

возвращает пустой массив и _.sample([]) === undefined .

Вставьте чек для такого рода случаев, и все будет хорошо.

Комментарии:

1. Это моя схема персонажа: sourceb.in/3RiX39Flgw

2. Это не имеет ничего общего со схемой. Только фактическое содержимое вашей базы данных.

3. Итак, отсутствует ли в базе данных $type: ‘символ’? prnt.sc/13oji69

4. Я предполагаю, что вы должны проверить cardToAdd наличие пустого ответа после const cardToAdd = _.sample(await model('Character').find({ tier })); . Поскольку он не может (и фактически не возвращает) никаких документов по запросу .find({ tier }) .