Не удается обновить курс по его ID с использованием MongoDB и Mongoose в Node.js

Вопросы и ответы
const mongoose = require('mongoose');

mongoose.connect("mongodb://localhost:27017/mongo-exercise")
.then( ()=> console.log("Подключено к MongoDB..."))
.catch(err => console.error("Не удалось подключиться к базе данных...",err));

Ниже приведена схема и модель курса

const courseSchema = new mongoose.Schema({
    name:String,
    author:String,
    tags:[String],
    date:Date,
    isPublished: Boolean,
    price:Number
});

const Course = mongoose.model('Course',courseSchema);

Вот функция для получения списка курсов на основе определенных критериев.

async function getCourses() {
    return await Course
    .find({isPublished:true})
    .or([
        {price : {$gte: 15}},
        {name : /.*by.*/}
        ])
    .sort('-price')
    .select('name author price')
};

Вот функция для обновления автора курса определенного курса по его идентификатору, но она не срабатывает и выводит, что курс не найден.

async function updateCourse(id) {
    const mongoose = require('mongoose');
    console.log('Проверка..');
    if (!mongoose.Types.ObjectId.isValid(id)) {
    console.log('Некорректный формат ID');
    return;
}
    try {
        const course = await Course.findById(id);
        if (!course) {
            console.log('Курс не найден');
            return;
        }

        course.isPublished = false;
        course.author="Manish";

        const result = await course.save();
        console.log(result);
    } catch (error) {
        console.error('Ошибка при обновлении курса:', error);
    }
}

ID курса, который я пытаюсь обновить, совпадает с другими ID, существующими в базе данных, но это не работает. Но при запросе к базе данных тот же ID появляется.

async function run() {
    const courses = await getCourses();
    console.log("Список курсов \n" ,courses);

}
updateCourse('5a68fdd7bee8ea64649c2777');

Вот вывод запроса к базе данных

Список курсов
 [
  {
    _id: new ObjectId('5a68fdd7bee8ea64649c2777'),
    name: 'Курс Node.js',
    author: 'Mosh',
    price: 20
  },
  {
    _id: new ObjectId('5a6900fff467be65019a9001'),
    name: 'Курс Angular',
    author: 'Mosh',
    price: 15
  },
  {
    _id: new ObjectId('5a68fde3f09ad7646ddec17e'),
    name: 'Курс ASP.NET MVC',
    author: 'Mosh',
    price: 15
  },
  {
    _id: new ObjectId('5a68fe2142ae6a6482c4c9cb'),
    name: 'Курс Node.js от Джека',
    author: 'Jack',
    price: 12
  }
]

А вот и вывод обновления

Проверка..

Подключено к MongoDB…

Курс не найден

Я пробовал это решение, чтобы найти курс по его названию, и оно работает.

async function testQuery() {
    const course = await Course.findOne({ name: 'Курс React' });
    console.log('Курс найден по имени:', course);
}

debugQuery();

Какова может быть причина того, что курс не обновляется, или есть ли что-то неправильное в моем подходе?

Ответ

Проблема, с которой вы сталкиваетесь, когда не можете обновить курс по его идентификатору (ID), может быть вызвана несколькими факторами. Давайте разберемся в вашем коде и найдем источник проблемы.

Возможные причины проблемы:

  1. Неправильный формат ID: Убедитесь, что идентификатор, который вы передаете в функцию updateCourse, имеет правильный формат. Вы уже используете mongoose.Types.ObjectId.isValid(id), что является хорошей проверкой.

  2. Неинициализированная база данных: Возможно, база данных не инициализировалась должным образом. Убедитесь, что ваша база данных работает, и вы можете делать запросы без ошибок.

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

  4. Проблема с объектом модели: Вы ищете курс по ID, но, возможно, объект курса был изменен или был использован другой экземпляр. Важно убедиться, что вы извлекаете курс по корректному ID.

Решение проблемы:

Вот улучшенная версия вашего кода, которая учитывает указанные выше причины:

const mongoose = require('mongoose');

mongoose.connect("mongodb://localhost:27017/mongo-exercise", { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => console.log("Connected to MongoDB..."))
.catch(err => console.error("Failed to connect to db...", err));

const courseSchema = new mongoose.Schema({
    name: String,
    author: String,
    tags: [String],
    date: Date,
    isPublished: Boolean,
    price: Number
});

const Course = mongoose.model('Course', courseSchema);

async function getCourses() {
    return await Course
    .find({ isPublished: true })
    .or([
        { price: { $gte: 15 } },
        { name: /.*by.*/ }
    ])
    .sort('-price')
    .select('name author price');
}

async function updateCourse(id) {
    console.log('Checking...');
    if (!mongoose.Types.ObjectId.isValid(id)) {
        console.log('Invalid ID format');
        return;
    }

    try {
        const course = await Course.findById(id);
        if (!course) {
            console.log('Course not found');
            return;
        }

        course.isPublished = false;
        course.author = "Manish";

        const result = await course.save();
        console.log('Updated course:', result);
    } catch (error) {
        console.error('Error updating the course:', error);
    }
}

async function run() {
    const courses = await getCourses();
    console.log("List of courses:\n", courses);

    // Обратите внимание на правильный ID
    await updateCourse('5a68fdd7bee8ea64649c2777');
}

run();

Проверьте следующее:

  • Убедитесь, что вы вызываете updateCourse после выполнения всех асинхронных операций и подключения к базе данных.
  • Проверьте, соответствует ли ID запрашиваемого курса ожидаемому ID в базе данных.
  • Убедитесь, что никаких дополнительных вызовов updateCourse не происходит одновременно с вашей функцией run.

Если проблема все еще не решается, рассмотрите возможность отладки с помощью console.log для проверки значений, которые вы передаете и получаете, и дополнительная информация о том, что происходит в процессе выполнения.

Оцените материал
Добавить комментарий

Капча загружается...