#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. это сработало, я думаю, я не очень хорошо заметил мой новый подход. кстати, можете ли вы объяснить мне фактическую разницу между этими подходами?