在 Mongoose 中运用 Async/Await 实现异步操作

阅读时长 8 分钟读完

在 Node.js 项目中,Mongoose 是一个流行的 MongoDB Node.js 驱动程序。它简化了与 MongoDB 的交互,并提供了一种简单而强大的数据建模方式。在开发 Node.js 的 Mongoose 应用程序时,我们通常需要执行异步操作,例如查询、保存或删除文档等。本文将探讨如何使用 Async/Await 在 Mongoose 中进行异步操作。

异步操作和回调

在 Node.js 中,异步操作是非常重要的,因为 Node.js 采用单线程模型。如果您有一个长时间运行的操作,例如读取大量数据或连接到数据库,如果您不是采用异步操作,则运行这些操作的线程或进程将一直被占用,因此无法响应其它请求。异步操作的解决方案是回调。您可以使用回调函数以异步方式执行代码,这样在长时间运行的操作期间,您不需要占用线程或进程。

例如,以下代码示例演示了如何使用回调函数在 Mongoose 中查询文档:

-- -------------------- ---- -------
----- ---- - ------------------

-------------- ----- ------ -- -------- ----- ----- -
  -- ----- -
    -------------------
  - ---- -
    ------------------
  -
---

上面的示例代码中,我们使用 findOne 方法来查询一个文档。在回调函数中,我们检查是否有错误并打印出结果。

Async/Await

尽管使用回调函数进行异步操作非常方便,但任何JavaScript程序员都会知道回调地狱是一个真正的挑战。回调地狱是指使用嵌套回调时的代码可读性极差,并且难以调试、维护和扩展。随着 ECMAScript 2017 的发布,JavaScript 引入了一个称为 Async/Await 的异步解决方案。Async/Await 是一种基于 Promise 的语法糖,可以让您像同步代码一样编写异步操作。

Async

async 关键字是用来标记一个函数是异步的。异步函数返回一个 Promise 对象对,这个对象将resolve为函数的返回值,reject 为错误信息。

考虑以下示例代码:

上面的代码演示了如何定义一个异步函数。这个函数返回 "Hello World",但是实际上它返回一个 Promise 对象。我们可以通过调用这个函数并使用 .then 方法来访问该对象的结果:

Await

await 关键字用于等待一个 Promise 对象完成。它只能用在异步函数里。当我们在异步函数中使用 await 关键字时,它会等待 Promise 结束并解析完成或拒绝之后,然后才执行下一行代码。

-- -------------------- ---- -------
----- -------- --------- -
  ------ --- ----------------- ------- -- -
    ------------- -- -
      -------------- --------
    -- ------
  ---
-

----- -------- ------ -
  ----- ---- - ----- ----------
  ------------------  -- --- ----- -----
-

-------

上面的例子中,我们定义了两个异步函数 getDatamain。getData 会等待 1000 毫秒并返回一个解决的 Promise 对象「resolve("Hello World")」。然而,在 main 函数中,我们使用 await 从这个 Promise 对象中获取数据并打印到控制台。

Mongoose 中的异步操作和 Async/Await

看到了与异步操作和 Async/Await 的相关内容后,让我们来看一些在 Mongoose 中进行异步操作的示例。

查询文档

使用 Async/Await 在 Mongoose 中执行查询操作非常简单。您只需要在查询方法的前面放 async 关键字并在您调用该方法的语句前放置 await

-- -------------------- ---- -------
----- ---- - ------------------

----- -------- --------- -
  --- -
    ----- ---- - ----- -------------- ----- ------ ---
    ------------------
  - ----- ----- -
    -------------------
  -
-

----------

上述代码是在 Mongoose 中使用 Async/Await 的查询示例。我们定义了一个名为 getUser 的异步函数。它使用 findOne 方法来查询一个文档。如果查询成功,则user 变量将解析为文档对象。如果查询失败,则会在 catch 块中捕获错误并打印错误信息。

插入和保存文档

在 Mongoose 中使用 Async/Await 实现插入和保存操作也很简单。您可以使用 save 方法保存一个新的文档到数据库中。

-- -------------------- ---- -------
----- ---- - ------------------

----- -------- ---------- -
  ----- ---- - --- ------
    ----- -------
    ------ -------------------
    ---- --
  ---

  --- -
    ----- ------------
    ----------------- ----- ----------------
  - ----- ----- -
    -------------------
  -
-

-----------

上面的代码指定一个用户(包括名称、电子邮件和年龄),并定义了一个异步函数 saveUser(),它将用户对象保存到数据库。如果保存成功,则将显示 User saved successfully!。否则,它将显示错误消息。

更新文档

在 Mongoose 中使用 Async/Await 更新文档也非常容易。您可以使用 updateOnefindByIdAndUpdate 方法以异步方式更新数据库中的文档。

-- -------------------- ---- -------
----- ---- - ------------------

----- -------- ------------ -
  --- -
    ----- ---- - ----- -------------- ----- ------ ---

    -- ------
    -------- - ---
    
    ----- ------------
    ----------------- ------- ----------------
  - ----- ----- -
    -------------------
  -
-

-------------

上述代码演示了如何在 Mongoose 中使用 Async/Await 更新文档。它使用 findOne 方法进行查找,并在成功找到文档后,更新对象的年龄字段以及保存到数据库中。如果操作成功,则会输出 User updated successfully!。否则,它将显示错误消息。

删除文档

在 Mongoose 中使用 Async/Await 删除文档也是相当简单的。您可以使用 deleteOnefindByIdAndRemove 方法以异步方式从数据库中删除文档。

-- -------------------- ---- -------
----- ---- - ------------------

----- -------- ------------ -
  --- -
    ----- ---- - ----- -------------- ----- ------ ---

    ----- -----------------
    ----------------- ------- ----------------
  - ----- ----- -
    -------------------
  -
-

-------------

上述代码演示了如何在 Mongoose 中使用 Async/Await 删除文档。它使用 findOne 方法进行查找,并在成功找到文档后,使用 deleteOne 方法将它从数据库中删除。如果操作成功,则会输出 User deleted successfully!。否则,它将显示错误消息。

结论

虽然 Async/Await 可能是一项相对较新的技术,但是它已经成为了现代 JavaScript 中的必选项之一。使用 Async/Await 在 Mongoose 中进行异步操作,可以让您编写更加模块化、可读性更高的代码,也可以使您更轻松地调试您的应用程序。此外,它还提供了更好的错误处理机制,能让您在出现错误时更快地调试和解决问题。

希望本文能够从实际应用和代码演示中,有效地指导读者在 Mongoose 和 Async/Await 的使用中更能深入和升华,这对于开发者来说是一个非常有用的技能。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670f71da5f5512810264782f

纠错
反馈