【问题标题】:Properly terminate NodeJS Async Await正确终止 NodeJS Async Await
【发布时间】:2017-05-25 04:17:15
【问题描述】:

我编写了以下代码以连接到包装在 Promise 中的 MongoDB,但是一旦连接,我的 NodeJS 代码仍在运行/无法正确退出。我可以知道返回或终止它的正确方法是什么吗?

function connectDB() {
  return new Promise (resolve => {
    MongoClient.connect(mongoUrl, function( err, db ) {
      _db = db;
      resolve(db);
    });
  })
}


(async function crawl() {
  const db = await connectDB(); 
  console.log('You are connected');
})()

【问题讨论】:

  • 大多数数据库驱动程序在您第一次连接到数据库后会保持与数据库的开放连接。这是一项性能优化,值得一试,因为如果您需要为每个请求继续连接到数据库,您可能会损失超过 50% 的吞吐量。因此,仍然有一个打开的套接字以及事件处理程序来处理来自该套接字的数据。这就是节点不退出的原因。完成后尝试关闭 MongoClient 连接
  • 我认为问题不在于异步/等待。当您放弃承诺并调用 MongoClient.connect 时,节点是否正确退出?
  • 是的。调用 db.close() 可以解决问题,谢谢! @slebetman 你想把它作为我标记的解决方案吗?

标签: javascript node.js asynchronous async-await


【解决方案1】:

这与async/await 没有真正的关系,它也不会发生。正如@Torazaburo 在 cmets 中所述,db 驱动程序保持与数据库的开放连接,并且此开放套接字(及其事件处理程序)可防止节点退出。关闭连接有帮助:

function connectDB() {
  return new Promise (resolve => {
    MongoClient.connect(mongoUrl, function(err, db) {
      if (err) reject(err);
      else resolve(db);
    });
  });
}

(async function crawl() {
  const db = await connectDB(); 
  console.log('You are connected');
  db.close();
  console.log('You are no longer connected. Bye!');
})()

【讨论】:

  • 谢谢,当它是我的 mongodb 客户端时,如果我不理解承诺,我想了 15 分钟。
【解决方案2】:

一个promise有两个参数:resolve和reject。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

您需要更改您的承诺声明:

return new Promise ((resolve, reject) => {
  // ...
}

之后,在你的 promise 中添加 return 语句:

return resolve(db)

另外,我建议你在你的承诺中添加一个错误日志:

if (err) return reject(err)

并捕获此错误。

祝你好运!

【讨论】:

    猜你喜欢
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    相关资源
    最近更新 更多