#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:
это, скорее всего, cardToAdd.type
вы уверены, что cardToAdd не определен ? я думаю, что эта строка ничего не возвращает :
const cardToAdd = _.sample(await model('Character').find({ tier }));
это означает, что этот код может ничего не возвращать :
await model('Character').find({ tier })
Комментарии:
1. Он отображает ошибку только в том случае, если значение $guaranteedTier больше 1