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
相关产品推荐
相关产品推荐

