Db.Collection не является конструктором

У меня возникла проблема: я пытаюсь создать систему прокачки в 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() в моем коде. Это дает мне больше ошибок, и я действительно хочу, чтобы мой код не содержал ошибок и мог сохранять мои данные в базе данных.

Level и new level(...) вам наверняка захочется new Level(...)
derpirscher 05.08.2024 12:54

@derpirscher Я уже пробовал то же самое, но мне прислали ошибку db.Collection.findOne is not a function.

Christian Ambarita 05.08.2024 13:32

Где определяется Level?

Joe 05.08.2024 21:11

@Joe Привет, я решил отправить полный код. Надеюсь, он сможет ответить на вопрос.

Christian Ambarita 06.08.2024 11:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Привет, я знаю, что ответ пришел немного поздно, но, возможно, я все равно смогу вам помочь! Мы особенно обращаем внимание на следующие фрагменты вашего кода:

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, а скорее documentlevel, то есть null, потому что ни один не был найден. Поэтому замена new level({ на new Level({ решит вашу проблему.

Кроме того, не следует использовать await и .then() одновременно. Это очень необычное поведение. Вот статья о разнице await и .then() и их преимуществах: https://dev.to/masteringjs/using-then-vs-async-await-in-javascript-2pma.

Другие вопросы по теме