#node.js #mongoose #promise
#node.js #мангуст #обещание
Вопрос:
У меня возникла проблема с пониманием разницы между следующим фрагментом кода при подключении к MongoDB.
1: mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, (err) => {
if (err) {
return err
}
console.log('connected to DB!');
})
2: mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true })
mongoose.connection
.on('error', (error) => {
console.warn(error)})
.once('open', () => {
console.log('connected to DB!')})
3: mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => console.log('connected to DB!'))
.catch(error => console.log(error))
Итак, насколько я понимаю, mongoose.connect
они возвращают обещание, и мы должны обрабатывать обещание с помощью eihter .then.catch
или aync/await
, но здесь также используется функция обратного вызова.
Может кто-нибудь объяснить мне эти 3 метода?
Комментарии:
1. В ваших трех примерах единственное отличие заключается в том, как обрабатываются ошибки (
console.log
console.warn
против игнорирования). В общем, они делают то же самое, не уверен, что именно вы хотите объяснить. Посмотрите на использование в реальном коде.2. Я на самом деле спрашивал, возможно ли всегда обрабатывать обещание с помощью функций обратного вызова? потому что я знал, что мы справимся с этим с помощью. затем и асинхронный / ожидание
3. Мне все еще не ясно. То, что вы передаете
then
, иcatch
является функциями обратного вызова. Это так?
Ответ №1:
Номера 1 и 3 делают то же самое: они обрабатывают первоначальный успех / сбой соединения. Поскольку не все используют обещания, они предлагают средство для обработки этого с помощью обратного вызова. В обоих случаях обратный вызов / обещание будет вызываться во время первого соединения, более позднего сбоя во время выполнения не будет. Вы, конечно, должны использовать только одну функцию одновременно, либо обратный вызов, либо обещание.
Номер 2 добавьте средство прослушивания событий, которое будет запускать его обратный вызов каждый раз, когда возникает ошибка с подключением, а не только во время первоначального подключения. Его можно использовать в дополнение к номерам 1 и 3 для обработки ошибок в течение срока службы вашей программы.
Дополнительная информация здесь: https://mongoosejs.com/docs/connections.html#error-handling
Комментарии:
1. Спасибо, но, насколько мне известно, я обрабатываю обещание с помощью .then/.catch ИЛИ async/await . Никогда не обрабатывал обещания с обратными вызовами, и я запутываюсь
2. Вы правы в отношении обработки обещаний. Вы не обрабатываете обещание с обратным вызовом: мангуст вызывает обратный вызов, если он предоставлен, в противном случае он возвращает обещание.
Ответ №2:
Две вещи, которые вам нужно изучить и принять во внимание:
- понимание обещаний и обратных вызовов; понимание обработки ошибок (попробуйте … поймать); понимание обработки концепций (обещания; асинхронный / ожидание; обратный вызов)
- что означает и выполняет код # 1, # 2 и # 3
О концепциях
Некоторые довольно хорошие недавние ссылки:
- на Обещания против обратного вызова и Использование обещаний и концепции цепочки
- при попытке … поймать
- при асинхронном / ожидании
Итак, во-первых: я бы посоветовал вам полностью понять различные концепции, приведенные выше, и идеи о том, как с ними обращаться.
Затем: разделите различные концепции, о которых вы говорите в своем вопросе. Они означают разные вещи, и стандартного способа их использования не существует: вы должны принять решение об их использовании на основе того, что вам нужно, и того, что вы делаете со своим кодом.
Подводя итог:
- Обещание
объект, представляющий возможное завершение или сбой асинхронной операции
- Обратный вызов
функция, переданная в другую функцию, в которой последняя вызовет первую, как только будет достигнут определенный статус (точка возврата; возникновение ошибки; принятое решение и т. Д.)
- асинхронный / ожидающий
эта концепция заставляет асинхронный код выглядеть и вести себя как синхронный код; и это упрощает поведение при использовании обещаний синхронно и для выполнения некоторого поведения над группой обещаний
- попробуйте … поймать
метод для обработки исключений (!!!) — не обязательно метод для обработки ошибок (обычно ошибка вызывает исключение, но вы можете захотеть или использовать его для других целей)
Как вы можете видеть, все эти парадигмы имеют разные значения, и вы можете видеть, что они используются в сочетании определенным образом. Однако вы не обязательно вынуждены использовать их так, как вы обычно видите, что они используются.
В коде
Это самая простая часть, когда вы полностью понимаете концепции:
- # 1: Использование механизма обратного вызова -> вы будете подключены к базе данных MongoDB или, если в процессе установления соединения возникает ошибка, вы вернете ошибку (через механизм обратного вызова)
- # 2: используя сочетание вызова функции
mongoose.connect
и цепочки -> вы не обрабатываете возможные ошибки при подключении (так что это в конечном итоге станет проблемой); затем, ЕСЛИ ПОДКЛЮЧЕНО, если ошибка возникает во время открытия соединения, вы пишете предупреждение на консоль; когда соединение прерывается.открыть (если предыдущее утверждениеmongoose.connect(...)
было успешным, вы указываете, что база данных подключена - # 3: использование только концепции цепочки -> вы пытаетесь установить соединение; затем, в случае успеха, вы подключены; затем, если не удалось, вы перехватываете ошибку
Надеюсь, это поможет. 😉