#node.js #mongodb #es6-promise
#node.js #mongodb #es6-обещание
Вопрос:
module.exports.getTopMeal = function () { mealKitModel.find({ "top_meal": true }) .then((kits) =gt; { return kits; }) .catch((err) =gt; { console.log("Error finding top mealkit"); }) }
Здесь я пытаюсь найти объекты, у которых есть атрибут top_meal true из MongoDB. Когда я помещаю инструкцию «console.log(комплекты)» в часть.then(комплекты), это дает мне желаемый результат. Но когда я импортирую эту функцию в другой файл javascript, возвращаемое значение этой функции показывает неопределенное. Я возвращаю наборы в части .then (), чтобы первое выполнение обещания find завершилось, а затем оно возвращает переменную kits.
Пожалуйста, кто-нибудь, покажите мне, где я ошибаюсь?
Ответ №1:
Вам нужно вернуть обещание.
module.exports.getTopMeal = function () { return mealKitModel.find({ "top_meal": true }) .then((kits) =gt; { return kits; }) .catch((err) =gt; { console.log("Error finding top mealkit"); }) }
Теперь вы можете сделать
getTopMeal().then(topMeal =gt; { console.log(topMeal) })
В дополнение. Поскольку метод find возвращает наборы, вам не нужно явно возвращать его, поэтому функция становится:
module.exports.getTopMeal = function () { return mealKitModel.find({ "top_meal": true }) }
Обратите внимание, что я также удалил функцию catch из mealKitModel.найдите, так как обычно вы не хотите перехватывать каждую функцию и выходить из нее, а вместо этого в конце есть один обработчик ошибок. Лучше всего просто вернуть обещание и разобраться с ним позже.
В принципе: Если вы поймаете в mealkitмодель.обнаружите, что вы не можете поймать ошибку из getTopMeal.
Но теперь, с рефакторингом, где вы просто возвращаете обещание, которое теперь можете выполнить:
getTopMeal().then(topMeal =gt; { console.log(topMeal) }) .catch(e =gt; { console.log('now we can catch the error') console.log(e) })
Комментарии:
1. Здесь нужно исправить еще две вещи. Это
.then(kits =gt; return kits)
совершенно не нужно, так как это уже разрешенное значение обещания. И,.catch()
это «съедает» ошибку и не позволяет ей распространяться обратно вызывающему абоненту. Если вы собираетесь регистрировать ошибку внутренне, вам придется пересмотреть ее, чтобы вызывающий абонент увидел отклонение.2. Да, я это добавил. Просто не сохранил изменения до вашего комментария 🙂
3. Я не знаю, сделали ли вы это специально или нет, но вы отредактировали правку, которую я внес в ваш вопрос, чтобы добавить
.catch()
в ваш пример кода (2-й блок кода в вашем вопросе). Мы всегда должны рекомендовать ответы, которые вызывают отказы в обещаниях. Ваш ответ в настоящее время этого не показывает.4. Специально да, так как getTopMeal, как он это реализовал, не может поймать никаких ошибок, его код поглощает ошибку с помощью catch и console.log — так что добавленный .catch, который вы добавили, ничего не поймает. Ответ, который он искал, заключался в добавлении возврата. Я объяснил это, а затем продолжил разговор о том, как он не должен поглощать ошибку, а вместо этого использовать обработчик ошибок.
5. В будущем, когда вы отмените чьи-либо изменения, было бы уместно поместить комментарий под ответом и объяснить, что/почему вы изменили вместо этого. Ваша текущая версия теперь в порядке.