Node.js 猫鼬与承诺和回调

Node.js 猫鼬与承诺和回调,node.js,mongoose,promise,Node.js,Mongoose,Promise,在连接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, useUnifiedTopolo

在连接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
处理承诺。然后。catch
aync/await
但在这里它也使用了回调函数。
有人能给我解释一下这三种方法吗?

第一种和第三种方法的作用是一样的:它们处理初始连接的成功/失败。由于不是每个人都使用承诺,它们也提供了一种通过回调来处理承诺的方法。在这两种情况下,将在第一次连接期间调用回调/承诺,而在执行期间不会出现后续故障。当然,一次只能使用一个特性,回调或承诺

第二,添加一个事件列表器,它将在每次连接出错时触发回调,而不仅仅是在初始连接期间。除了数字1和3之外,它还可以用来处理程序生命周期中的错误


更多信息请点击此处:

您需要研究并考虑两件事:

  • 理解承诺与回扣;低估错误处理 (试着……抓住);理解概念处理(承诺; 异步/等待;回调)
  • 代码#1、#2和#3的含义和作用
  • 关于概念

    最近的一些不错的链接:

    • 马上
    因此,首先:我建议你充分理解上述不同的概念以及如何处理它们的想法

    然后:将你在问题中谈论的不同概念解耦。它们意味着不同的东西,并且没有标准的方法来使用它们:您必须根据您的需要和您对代码所做的事情来决定它们的使用

    总结一下:

    • 允诺
    表示异步操作最终完成或失败的对象

    • 回拨
    传递给另一个函数的函数,在该函数中,一旦达到某一特定状态(返回点;发生错误;作出决定等),后者将调用前者

    • 异步/等待
    这一概念使得异步代码的出现和行为类似于同步代码;它简化了同步使用承诺的行为,并对一组承诺执行某些行为

    • 抓住
    处理异常的方法(!!!)-不一定是处理错误的方法(通常错误会引发异常,但您可能希望或需要将其用于不同的目的)

    正如您所看到的,所有这些范例都有不同的含义,您可以看到它们以特定的方式结合使用。但是,您不一定被迫以您通常看到的方式使用它们

    在代码上

    当您完全理解这些概念时,这是最简单的部分:

    • #1:使用回调机制-->您将连接到MongoDB数据库,或者,如果在建立连接过程中发生错误,您将返回错误(通过回调机制)
    • #2:混合使用函数调用
      mongoose.connect
      和chaining-->连接时不会处理最终的错误(因此这最终会成为一个问题);然后,如果连接,如果在连接打开期间发生错误,您将向控制台写入警告;连接打开时(如果前面的语句
      mongoose.connect(…)
      成功,则表明数据库已连接
    • #3:仅使用链接概念-->尝试建立连接;如果成功,则连接成功;如果未成功,则捕获错误

    希望这有帮助。

    在您的三个示例中,唯一的区别是错误的处理方式(
    console.log
    vs
    console.warn
    vs忽略)。一般来说,他们做同样的事情,不知道你到底想解释什么。看看真实代码中的用法。我实际上是在问,是否可以始终使用回调函数来处理promise?因为我知道我们使用.then和async/wait来处理它,我仍然不清楚。然后传递给
    catch
    的是回调函数。是吗?谢谢,但据我所知,我用.then/.catch或async/wait处理承诺。从未用回扣处理过承诺,我很困惑你在承诺处理上是正确的。您不能通过回调来处理承诺:mongoose调用如果提供了回调,您将被回调,否则它将返回承诺。