【问题标题】:Why does Node Js mongoose document deletion does not execute without await?为什么Node Js mongoose文档删除不等待不执行?
【发布时间】:2021-12-19 01:36:54
【问题描述】:

所以我是 Node.js 的新手,并且一直在检查它的 mongoose 包。我有一个带有字段名称=“测试条目”的文档的 mongodb 集合 我已经尝试对一个封装在超时内、封装在函数中的模型执行 .findOneAndDelete() 方法调用。

让我困惑的一个问题是为什么这段代码

function deleteEntry() {
  setTimeout(function () {
    Test_Model.findOneAndDelete({
      name: "Test Entry",
    });
  }, 5000);
}

deleteEntry();

不删除 mongodb 中的条目

function deleteEntry() {
  setTimeout(async function () {
    await Test_Model.findOneAndDelete({
      name: "Test Entry",
    });
  }, 5000);
}

deleteEntry();

这个可以。

除非有某种回调,否则 mongoose 方法不会执行。不管是不是为了虚荣? 有人提到过类似的东西 in the documentation 。是不是只有在有callback/await/then的时候才会真正执行命令?

【问题讨论】:

  • 实际上这两个例子确实从数据库中删除了文档。两个例子没有区别,两个例子都不返回任何承诺,也不接受回调,所以也许你可能会在实际文档被删除之前读取数据库..
  • 感谢您的回复!我正在使用 mongodb compass 查看数据库集合并验证结果。删除发生在后者而不是前者,我可以具体断言。从文档中我对 mongodb 查询对象的理解是它们有一个 .then() 方法并且可以传递回调。并且在此类辅助函数上重复传递回调或使用 await/.then() 也可以触发执行。但正如你所说。为什么不调用这个操作不会触发任务?
  • @Nur 正如你所说,虽然我的第一印象是类似的,但条目在代码执行之外仍然存在。

标签: node.js asynchronous mongoose


【解决方案1】:

“为什么不调用这个操作不会触发任务?” - 我认为 MongoDB 驱动程序会检查你是否传递了回调(作为参数),如果你没有传递回调,而是, 它返回 Promise。所以无论如何,你的操作都会被执行。

您还应该在setTimeout 函数中处理Error,因为它不处理来自任何异步操作的任何错误或错误。

试试这个例子:

let delay = ms => new Promise(ok => setTimeout(ok, ms));

async function deleteEntry() {
  await delay(5000);
  return Test_Model.findOneAndDelete({ name: "Test Entry" });
}

deleteEntry()
   .then(result => console.log(result))
   .catch(err => console.log(err));

【讨论】:

  • 感谢您的推理。虽然我理解你的观点。除非涉及等待,否则数据输入仍然不会反映在指南针中。更感谢您的额外指点!该延迟技巧将帮助我加载。 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
  • 2023-03-11
  • 2019-11-12
  • 2021-03-30
相关资源
最近更新 更多