【问题标题】:MongoDB client connect using async/await makes function stuckMongoDB 客户端使用 async/await 连接使功能卡住
【发布时间】:2020-04-27 02:29:49
【问题描述】:

MongoDB 客户端连接似乎可以工作,但功能只是挂起。

app.js

async function test() {
  console.log('Hello world');
  await new Promise((resolve) => {
    setTimeout(resolve, 50);
  });
  console.log('Bye world');
}
test();

当我在 cmd 上使用 node app.js 运行时,我得到了日志,并且 shell 按预期退出。 但是,当我运行此代码时 ->

async function test() {
  console.log('Hello world');
  await MongoClient.connect(MONGODB_URI);
  console.log('Bye world');
}
test();

然后我使用 node app.js 再次运行。这次我也得到了两个日志,但进程永远不会退出。 这里发生了什么?我错过了一些非常明显的东西吗?

【问题讨论】:

  • 您收到错误消息。使用try catch 看看会发生什么。可能是 mongo 没有连接。
  • @Ashh 我确实打印了客户端对象,我可以很好地访问数据库和集合。
  • 您尝试使用的模式记录在哪里(连接方法返回一个承诺)?
  • @Oleg await 解析承诺并返回客户端。

标签: javascript node.js mongodb async-await


【解决方案1】:

我确实知道这里发生了什么。

const client = await MongoClient.connect(URI);

将连接的客户端返回到数据库。但是,如果我不关闭与客户端的连接,节点进程仍然挂起。因此,下面的代码按预期工作。

const client = await MongoClient.connect(URI);
// Execute some queries
await client.close();

虽然我没有正确阅读 MongoDB 文档可能只是一个错误,但我将分享我所面临的这个错误的后果。

我有一个 AWS lambda 函数代码如下:

module.exports.handler = async (event) => {
  const client = await MongoClient.connect(URI);

  // Do something with the client but forgets to close

  const response = {
    statusCode: 200,
    headers: {
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Credentials': true,
    },
    body: JSON.stringify({ foo: 'bar' }),
  };

  console.log(response);
  return response;
};

我得到了正在打印的响应日志,但该函数将超时并且不会返回响应。

因为这是我第一次使用 lambdas 和 MongoDB,所以我拉了一些头发,所以记住伙计们,在你完成它们之后关闭你的连接。

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2020-02-05
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多