为啥Node Js mongoose文档删除不等待不执行?

Posted

技术标签:

【中文标题】为啥Node Js mongoose文档删除不等待不执行?【英文标题】: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 正如你所说,虽然我的第一印象是类似的,但条目在代码执行之外仍然存在。 【参考方案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

以上是关于为啥Node Js mongoose文档删除不等待不执行?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Node.js Mongoose 删除文档?

如何使用 Node.js Mongoose 删除文档?

Node.js/mongoose - 数组中的子文档不会删除/移除

Node.js/mongoose - 数组中的子文档不会删除/移除

Mongoose 为啥要添加空白数组?

删除 mongoose 中的嵌入文档