У меня возникла проблема: я пытаюсь создать систему прокачки в Discord, используя discord.js и MongoDB. Каждый раз, когда я пытаюсь загрузить свои данные в базу данных, я постоянно получаю сообщение об ошибке.
level is not a constructor
Я следовал инструкциям Почему save() в mongoose не является функцией? пост о сохранении новых данных в MongoDB, но я все равно получаю ту же ошибку.
Вот мой код, над которым я работал:
const { Events, Message } = require("discord.js");
const Level = require("../models/Level");
const getLevelXP = require("../utility/getLevelXP");
function getRandomXP(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
}
module.exports = {
name: Events.MessageCreate,
async execute(message) {
if (!message.inGuild() || message.author.bot) return;
const XPToGive = getRandomXP(5, 15);
const query = {
userId: message.author.id,
guildId: message.guild.id,
};
try {
await Level.findOne(query).then(async (level) => {
if (!level) {
const newLevel = new level({
userId: message.author.id,
guildId: message.guild.id,
xp: XPToGive,
});
await newLevel.save();
return;
}
level.xp += XPToGive;
if (level.xp > getLevelXP(level.level)) {
level.xp = 0;
level.level += 1;
message.channel.send(
`@${message.member} have been leveled up to **Level ${level.level}**`,
);
}
await level.save().catch((error) => {
console.error(`[ERROR] ${error}`);
return;
});
});
} catch (error) {
console.error(`[ERROR] ${error}`);
}
},
};
У меня возникли проблемы с использованием find()
вместо findOne()
в моем коде. Это дает мне больше ошибок, и я действительно хочу, чтобы мой код не содержал ошибок и мог сохранять мои данные в базе данных.
@derpirscher Я уже пробовал то же самое, но мне прислали ошибку db.Collection.findOne is not a function
.
Где определяется Level
?
@Joe Привет, я решил отправить полный код. Надеюсь, он сможет ответить на вопрос.
Привет, я знаю, что ответ пришел немного поздно, но, возможно, я все равно смогу вам помочь! Мы особенно обращаем внимание на следующие фрагменты вашего кода:
const Level = require("../models/Level");
и
await Level.findOne(query).then(async (level) => {
if (!level) {
const newLevel = new level({
userId: message.author.id,
guildId: message.guild.id,
xp: XPToGive,
});
await newLevel.save();
return;
}
}
Вы импортируете модель уровня и назначаете ее Level
в первом фрагменте. Во втором фрагменте вы ищете конкретный документ по вашему запросу. Если ничего не найдено, вы пытаетесь создать недостающий документ. Однако — и здесь возникает проблема — вы вызываете не импортированный класс Level
, а скорее document
level
, то есть null
, потому что ни один не был найден.
Поэтому замена new level({
на new Level({
решит вашу проблему.
Кроме того, не следует использовать await
и .then()
одновременно. Это очень необычное поведение. Вот статья о разнице await
и .then()
и их преимуществах: https://dev.to/masteringjs/using-then-vs-async-await-in-javascript-2pma.
Level
иnew level(...)
вам наверняка захочетсяnew Level(...)