如何解决 Mongoose 使用 findOne 查询出来的对象为 undefined 的问题?

阅读时长 4 分钟读完

在使用 Mongoose 在 Node.js 中进行数据库操作时,常常会遇到 findOne 查询出来的结果为 undefined 的情况,特别是在进行异步操作时更为突出。那么,我们该如何解决这个问题呢?本文将为大家详细介绍解决方案。

问题分析

在使用 findOne 查询时,如果查询的对象不存在,则返回值为 null,但是在异步操作中,由于代码先执行回调函数,因此在接收返回值前就已经执行了下一段代码,导致返回值为 undefined。例如:

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

上述代码在控制台中输出的 result 为 undefined,这是因为异步回调函数中的代码还没有执行完成,result 就被输出了,因此需要对此进行改进。

解决方案

为了解决这个问题,我们可以使用 Promise 来进行异步处理。具体思路是,将 findOne 查询封装成一个 Promise 对象,当查询成功时 resolve,查询失败时 reject。

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

接着,我们可以使用 async/await 来使代码异步化,这样可以保证查询结果已经返回后再执行下一步操作。

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

在使用 async/await 进行异步操作时,需要注意:需要使用 try-catch 来捕捉 Promise 中 reject 的错误,否则程序会中断。

总结

本文介绍了在使用 Mongoose 进行 findOne 查询时遇到的问题,并提供了一种解决方案:使用 Promise 进行异步处理,并使用 async/await 来使代码更为清晰。希望本文对大家有所帮助。

示例代码

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

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

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

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

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

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

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

纠错
反馈