Mongoose 是一个基于 Node.js 的 MongoDB 非官方驱动程序。Mongoose 可以让开发者更方便地在 Node.js 中使用 MongoDB 数据库,并附带了一个非常强大的 ORM(对象关系映射)工具,能够将数据库的数据转化为可读的 JavaScript 对象。在 Mongoose 中,大多数方法都是异步的,这也是 Node.js 的常见特性之一。如何正确地使用异步方法进行 Mongoose 操作,是我们讨论的主题。
异步方法的优缺点
在 Node.js 中,异步方法非常普遍,因为 Node.js 是一种基于事件驱动的编程语言。异步方法可以在不等待其它代码执行的情况下,进行其他操作,从而提高处理速度和性能。此外,异步方法还可以提高应用程序的可扩展性,因为在异步模式下,多个请求可以同时进行处理。
但是,异步模式并不是没有缺点。编写异步代码可能会提高代码复杂度,因为你必须小心处理回调函数的顺序,以及错误处理操作。异步代码还可能使调试更加困难,创建异步调用栈也可能是一个挑战。
示例
以下是添加一个新用户并检查数据库是否添加该用户的简单示例:
-- -------------------- ---- ------- ----- ---- - --- ------ ----- ------- -- ------------------ ----- - -- ----- - ---------------- - ------------- -------- ----- ----- - -- ----- - ---------------- - ----------------- -- ---- --- ------- --------- ----- -- --
异步回调和 Promises
Mongoose 提供两种实现异步模式的方式:回调函数和 Promises。使用回调函数是一种非常常见的做法,但 Promises,则可以更好地处理不同的场景,例如使用 Promise 的链式调用等情况。
异步回调
在 Mongoose 中,很多操作都是异步的,例如 findOne
、update
和 save
等。这些方法通常可以传递一个回调函数,当操作完成时回调函数将被调用,通知我们操作状态的成功与否。
下面是一个查询操作的例子:
Person.findOne({ name: 'Alice' }, function (err, person) { if (err) { console.log(err); // Do something with the error } console.log(person); // logs the person object // Do something with the person object });
在上面的例子中,如果出错,我们可以通过第一个参数获得错误信息。如果没有错,person 对象作为第二个参数传递给回调函数。可以在回调函数中继续处理该对象。
Promises
使用 Promises 的好处是可以更好地组织和控制代码流。Promises 提供了一种将异步操作转换为可视为同步操作的方式,因为可以使用 .then()
方法在操作完成时执行一个回调函数。可以使用 .catch()
捕获错误极其异常,Promise.all()
也可以方便地处理多个异步操作。
下面是一个查询操作的例子:
Person.findOne({ name: 'Alice' }).then(function (person) { console.log(person); // logs the person object // Do something with the person object }).catch(function (err) { console.log(err); // Do something with the error });
在上面的例子中,使用 .then()
方法继续处理该对象,如果出现错误,则使用 .catch()
方法捕获异常。
await 和 async 关键字
为了使异步操作更加清晰和简单,Node.js 8.0 以上版本引入了 async
和 await
关键字。这些关键字可以让异步操作看起来像是同步操作的控制流,因为你可以使用 await
关键字等待异步操作完成,然后进行下一步操作。这个特性可以让代码更加可读性高,并且有可能更加简明。
下面是一个查询操作的例子:
-- -------------------- ---- ------- ----- -------- -------------------- - ----- ------ - ----- ---------------- ----- ------- --- -------------------- -- ---- --- ------ ------ -- -- --------- ---- --- ------ ------ - ----------------------------------- ----- - ----------------- -- -- --------- ---- --- ----- ---
在上面的例子中,使用 await
关键字等待 Person.findOne()
方法完成,然后再继续执行其他代码。这能让代码看起来简单易懂,而且更容易调试和修改。
总结
在 Mongoose 中,使用异步方法并不难——只需要学习异步回调和 Promises 的基本知识 ,掌握 async
和 await
关键字,就可以在 Node.js 中更高效地使用 MongoDB 数据库。异步代码显然不算新鲜事物,在编写任何 Mongoose 代码之前,我们应该掌握正确地编写异步代码的方法,以便于处理大量数据并为客户端提供更快的响应时间。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64b3f4a448841e9894024920