Проблема с обработкой обещаний с использованием Mongoose

#javascript #mongoose #error-handling #promise

#javascript #mongoose #обработка ошибок #обещание

Вопрос:

Я работаю над своим собственным проектом. Его основная идея — обзоры фильмов.

В настоящее время я работаю над HTTP-запросами, пытаясь сделать свой код немного лучше. Я думаю, у меня проблема с обработкой моих обещаний:

     try {
        let newMovie = await MovieRepository.addNewMovie({
            name: req.body.name,
            year: req.body.year,
            description: req.body.description,
            length: req.body.length,
            genres: req.body.genres,
            totalRating: req.body.totalRating
        });
        return res.status(200).json({ name: newMovie, message: 'Movie added successfully!' });
    } catch (error) {
        return res.status(400).json({ status: 400, message: errorMessage.addNewMovie });
    }
  

Этот код работает! Я добавляю новый фильм и получаю статус OK, как и ожидалось.

Краткое объяснение моего кода: я использую, MovieRepository где я использую функциональность mongoose для добавления нового фильма. получить всю необходимую мне информацию из тела и отправить ее клиенту.

Теперь я попытался немного изменить свой код :

 let newMovie = await MovieRepository.addNewMovie({
        name: req.body.name,
        year: req.body.year,
        description: req.body.description,
        length: req.body.length,
        genres: req.body.genres,
        totalRating: req.body.totalRating
    }).then(() => {
        return res.status(200).json({
            name: newMovie,
            message: 'Movie added successfully!'
        });
    }).catch((error) => {
        return res.status(400).json({
            status: 400,
            message: errorMessage.addNewMovie,
            systemError: error
        });
    });
  

Этот код работает плохо.

Здесь я использую возможности promise для использования then и catch . Обратите внимание, что я на самом деле ничего не изменил в этих функциях.

В этом случае фильм также успешно добавлен в базу данных, но клиент получает статус 400.

Есть идеи, что здесь происходит?

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

1. Не могли бы вы скопировать / вставить свой метод addNewMovie, пожалуйста?

Ответ №1:

Возможно, я ошибаюсь в своем понимании (новичок в JS), но я думаю, что newMovie это не определено в вашем then вызове.

Попробуйте изменить:

 .then(() => {
  

Для:

 .then(newMovie => {
  

Кроме того, я думаю, что ваши return заявления в двух подходах (с обещаниями и без обещаний) не делают одно и то же, что может иметь последствия для остальной части вашего кода.


Это мое ограниченное понимание различий между этими двумя подходами:

  • Первый подход присваивает возвращаемое значение addNewMovie переменной newMovie , а внешняя асинхронная функция возвращает все, что res.status(...).json(...) возвращает.
  • Второй подход присваивает возвращаемое значение цепочки обещаний res.status(...).json(...) newMovie — и затем внешняя асинхронная функция неявно / автоматически возвращает undefined (если не показаны другие return инструкции).
  • Если бы вы переместили свой файл catch выше then , я думаю, это позволило бы вам увидеть, что ваш файл addNewMovie успешно завершается (т. Е. Фильм добавляется в базу данных), но что ваш обработчик успеха then выдает ошибку.

Я уверен, что кто-то другой может дать вам лучшее, более формальное и точное объяснение.

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

1. это сработало, я думаю, я не очень хорошо заметил мой новый подход. кстати, можете ли вы объяснить мне фактическую разницу между этими подходами?