首页 > 解决方案 > 是否使用 exec() 执行猫鼬?

问题描述

我想知道在这种情况下执行我的 Mongoose 查询的最佳方法是什么:

// 1
AgentLogs.find(searchParams)
  .sort({ timestamp: -1 })
  .exec(function (err, docs) {
    if (err) return res.status(500).send(err);
    res.json(docs);
    })
  .lean();

// 2
AgentLogs.find(searchParams, (err, docs) => {
  if (err) return res.status(500).send(err);
    res.json(docs);
  })
.sort({ timestamp: -1 })
.lean();

我“更喜欢”第 2 条,但除了我的感觉之外,还有什么更好或“正确”的方式?还是没关系?

标签: node.jsmongoose

解决方案


在大多数用例中,这两个选项都将以类似的方式工作。

出于某种原因,猫鼬使用了自己的类似 Promise 的实现,但不是真正的 Promise。这意味着查询实际上是thenable并且也可以与 async/await 一起使用,但这些不是真正的Promise.

当你调用.exec()它时,它会强制 mongoose 返回一个真实的、完全成熟的 Promise 对象。

这两种方法的主要区别在于,exec如果发生错误,一种方法可以为您提供更多详细信息和上下文信息——这就是推荐使用的主要原因exec

在 mongoose 文档中有一篇与此主题相关的单独文章。


推荐阅读