在猫鼬中执行 CRUD 操作时异步/等待

Posted

技术标签:

【中文标题】在猫鼬中执行 CRUD 操作时异步/等待【英文标题】:Async/await while performing CRUD operations in mongoose 【发布时间】:2019-06-20 01:18:54 【问题描述】:

我正在使用findByIdAndRemove mongoose 查询方法执行删除操作,并希望确保返回已删除的文档。我用谷歌搜索它,发现我们向findByIdAndRemove 传递了一个回调,其中我们传递了err, doc args,如果删除成功,则删除的值将在 doc 中返回,我们可以从 fn 调用返回。但我对async and await 有点困惑。我有deleteUserTask fn,它在内部调用async deleteUserTask fn,它是基于promise 的,并期望得到一个promise 作为回报,当resolved (.then) 我可以获得被删除的任务的值。

我不确定如何从我的async deleteUserTask fn 返回 doc 的值,然后将在.then promise 中解决,我可以使用它吗?

使用下面的方法返回的值是null,因为我根本没有返回文档值。

function deleteUserTask(req, res, next) 
  taskService
    .deleteUserTask(req.params.taskId)
    .then(task => 
      console.log(
        "Delete task request took " + (moment.now() - req.requestTime + " ms")
      );
      // below gives null
      console.log(task);
      res.json( task );
    )
    .catch(err => next(err));

taskService.js

async function deleteUserTask(id) 
  return await Task.findByIdAndRemove(id, function(err, doc) 
    if (err) 
      return err;
    
  );

【问题讨论】:

【参考方案1】:

如果使用了 Promise,则不应将回调与 findByIdAndRemove 一起使用。应该是:

async function deleteUserTask(id) 
  return await Task.findByIdAndRemove(id);

此时使用async函数没有任何好处,可以简化为:

function deleteUserTask(id) 
  return Task.findByIdAndRemove(id);

【讨论】:

谢谢。所以只是想知道,对于其他猫鼬查询操作也像 findOne、save、findOneAndUpdate、find 等,不需要异步调用,那些可以是简单的 fn?当我查询 mongoDB 时,我不需要在这里进行异步调用,稍后会解决。 调用仍然是异步的。 deleteUserTask 是异步的并返回一个承诺。在这种情况下不需要async 函数,因为使用await 并没有好处,它所做的只是返回一个promise。 如果没有回调,我该如何处理来自 findByIdAndRemove 调用的错误? 您已经在中间件中有catch。它会被拒绝。除此之外还需要额外处理吗? 是的,我有它会处理的。仍然有什么方法可以处理它而无需在 findByIdAndRemove fn 中回调?谢谢

以上是关于在猫鼬中执行 CRUD 操作时异步/等待的主要内容,如果未能解决你的问题,请参考以下文章

如何在猫鼬中进行原始 mongodb 操作?

如何在猫鼬中进行原始 mongodb 操作?

如何在猫鼬中执行“每个”查询

您可以在猫鼬中执行多个嵌套填充吗?

在猫鼬中使用时“修剪”是啥意思?

在猫鼬中使用时“修剪”是啥意思?