我在理解以下代码与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
返回了Promise,我们必须用.then.catch
或aync/await
来处理Promise,但是在这里它也使用了回调函数。
有人可以向我解释这三种方法吗?
答案 0 :(得分:0)
数字1和3做同样的事情:它们处理初始连接成功/失败。由于并非每个人都使用诺言,因此他们也提供了一种通过回调来处理诺言的手段。在这两种情况下,都将在第一个连接期间调用回调/承诺,而以后在执行期间失败则不会。当然,您一次只能使用一种功能,即回调或Promise。
数字2添加一个事件侦听器,该侦听器将在每次连接发生错误时触发其回调,而不仅仅是在初始连接期间。除了数字1和3之外,还可以使用它来处理程序生命周期中的错误。
此处有更多信息:https://mongoosejs.com/docs/connections.html#error-handling
答案 1 :(得分:0)
你需要研究和考虑的两件事:
关于概念
最近的一些不错的链接:
所以,首先:我建议您充分理解上述不同的概念以及如何处理它们的想法。
然后:将您在问题中谈论的不同概念分开。它们的含义不同,并且没有标准的使用方法:您必须根据您的需要以及您对代码的用途来决定它们的用法。
总结一下:
表示异步操作最终完成或失败的对象
传递给另一个函数的函数,一旦达到特定状态(返回点;发生错误;做出决定等),后者将调用前者
这个概念使得异步代码看起来和行为都像同步代码;并且简化了同步使用promise和对一组promise执行一些行为的行为
处理异常的方法 (!!!) - 不一定是处理错误的方法(通常错误会抛出异常,但您也可能希望或需要将它用于不同的目的)
正如您所见,所有这些范式都有不同的含义,并且您可以看到它们以特定方式结合使用。但是,您不一定会被迫按照您通常看到的使用方式使用它们。
关于代码
当您完全理解这些概念时,这是最容易的部分:
mongoose.connect
和链接 --> 在连接时你没有处理最终的错误(所以这最终会成为一个问题);然后,如果已连接,如果在连接打开期间发生错误,您将向控制台写入警告;当连接打开时(如果前面的语句 mongoose.connect(...)
成功,则说明数据库已连接希望这会有所帮助。 ;)