You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js Lambda异步调用DocumentDB后无法结束直至超时

Lambda连接DocumentDB后执行超时问题解决

你创建的Lambda函数能成功查询DocumentDB数据,但执行后无法结束直至超时,将return放在mongoClient()前则正常运行。

问题根源

Lambda函数执行完成后,MongoDB客户端的连接仍保持活跃,导致Lambda运行时的事件循环不为空,进程无法终止,最终触发超时。

解决方案

方案1:查询完成后关闭MongoDB连接

在return语句前主动关闭数据库连接,确保事件循环没有未处理的连接:

修改后的src/handlers/helloWorld.js代码:

"use strict";

const { mongoClient } = require("../helpers/dbHelper");

module.exports.handler = async (event, context) => {
  try {
    const db = await mongoClient();
    const data = await db.collection("mytable").find({}).toArray();

    console.log(data);
    // 关闭MongoDB客户端连接
    await db.client.close();

    return {
      statusCode: 200,
      body: JSON.stringify({ message: "hello world" }),
    };
  } catch (error) {
    console.log(error.message);
    throw error;
  }
};

方案2:禁用Lambda的事件循环等待

通过设置context.callbackWaitsForEmptyEventLoop = false,告诉Lambda函数无需等待事件循环为空即可结束执行,适合需要复用数据库连接池的场景:

修改后的src/handlers/helloWorld.js代码:

"use strict";

const { mongoClient } = require("../helpers/dbHelper");

module.exports.handler = async (event, context) => {
  // 禁用事件循环等待,Lambda执行完直接结束
  context.callbackWaitsForEmptyEventLoop = false;
  
  try {
    const db = await mongoClient();
    const data = await db.collection("mytable").find({}).toArray();

    console.log(data);

    return {
      statusCode: 200,
      body: JSON.stringify({ message: "hello world" }),
    };
  } catch (error) {
    console.log(error.message);
    throw error;
  }
};

方案对比

  • 方案1适合低频率调用场景,每次调用关闭连接,避免资源泄漏,但会增加每次调用的连接建立开销。
  • 方案2适合高频率调用场景,复用连接池提升性能,但需注意DocumentDB的连接数限制,避免超出配额。

内容的提问来源于stack exchange,提问作者justanotherpeter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:26:52