Mongoose 中的 promises(承诺)的使用方法和优化技巧

阅读时长 4 分钟读完

Mongoose 是一个非常流行的 Node.js ORM(对象关系映射)框架,可用于与 MongoDB 数据库进行交互。Mongoose 类库中提供了基于 Promises 的 API,以支持更加简洁和易于代码调试的编程风格。

正如我们将在本文中所解释的那样,通过使用 Mongoose 中的 Promises 所提供的不同方法和优化技巧,我们可以极度简化和提高我们在构建 Web 应用时的开发效率。

Promises:概览

在传统的回调函数模式中,我们可以使用以下模式执行异步操作:

但是,当我们需要完成多个异步操作(例如从数据库读取数据并将其显示为网页),我们就会遇到回调地狱问题。在这种模式下,代码会不断地深入嵌套,变得难以理解和维护。

为了解决这个问题,Promises 的概念被提出来了。Promises 是一种表示异步操作的设计模式,有一组方法可以用于表达异步操作完成或失败的结果。我们可以通过使用 Promise 的 then、catch 和 finally 方法,相比于传统的回调函数方法,在代码结构上获得相当的优势。

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

当 Promise 值被解析完成时(即完成或拒绝时),then 方法将所提供的回调函数作为参数运行。如果 Promise 被拒绝, catch 方法将运行,而 finally 方法将在 Promise 成功还是失败后运行。

在 Mongoose 中使用 Promise

在 Mongoose 类库中,默认的 Promise 实现是:

这意味着我们可以使用基于 Promise 的 Mongoose API,从而避免使用传统的回调函数方式来操作对象,如:

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

使用 Promise 可以使得我们的代码更加优雅和简洁:

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

Mongoose 中的优化技巧

使用 select 优化查询

调用 Mongoose 的 findOne 或 find 方法时,默认情况下,它返回一个 Mongoose 查询对象,该对象具有 select 方法。由于性能原因,建议查询结果仅包括所需的属性。通过使用 select 方法,可以仅将需要的属性传输到客户端,从而减少数据传输量并提高查询效率。

使用 lean() 方法优化查询

在进行大量数据查询时,因为 Mongoose 内部的操作,从 MongoDB 中返回的文档将具有 Mongoose 对象的形式。这导致了查询结果的序列化并不是十分高效,并且会占用服务器和客户端内存空间。可以通过使用 lean() 方法来解决这个问题,它会直接返回一个 JavaScript 文档,而不是 Mongoose 对象。

结论

通过使用 Mongoose 类库的基于 Promise 的 API,您可以避免回调地狱问题,并使用 Promise 的 then、catch 和 finally 方法来更加清晰地表达异步操作。另外,我们还学习了使用 select 和 lean() 方法来优化查询,以提高应用程序的性能。

在编写 Web 服务器端 Node.js 应用程序时,深入了解上述这些 Mongoose 所提供的活动极其重要。这将使您的代码更加优雅、简洁、速度更快,易于维护和处理!

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

纠错
反馈