本地运行正常的NodeJS MongoDB更新代码在AWS Lambda中失效
问题解决思路
核心问题:未等待异步操作完成
你的Lambda handler虽然标记为async,但调用run()时没有使用await,导致handler直接返回0,Lambda执行环境会立即终止进程,run函数里的异步操作(比如await movies.updateOne)还没来得及执行就被中断了,这就是日志只打印到"Inside the function"就停止的原因。
修改后的代码
exports.handler = async (event) => { console.log("I am here"); const { MongoClient } = require("mongodb"); const uri = "xxxxxxx"; const client = new MongoClient(uri); async function run() { console.log("Inside the function"); try { const database = client.db("mydb"); const movies = database.collection("TACountryMapping"); const filter = { Key: "Value" }; const options = { upsert: true }; const updateDoc = { $set: { Key: "updatedValue", address: "Canyon 123" }, }; const result = await movies.updateOne(filter, updateDoc, options); console.log(result); console.log( `${result.matchedCount} document(s) matched the filter, updated ${result.modifiedCount} document(s)` ); return result; } finally { await client.close(); } } // 关键:等待run函数执行完成 try { await run(); } catch (err) { console.error(err); // 抛出异常让Lambda捕获错误状态 throw err; } return 0; };
额外排查点
- MongoDB网络访问权限:确认Lambda所在的VPC安全组是否允许出站访问MongoDB的默认端口27017;如果MongoDB托管在云服务商(比如Atlas),还要检查IP白名单是否包含Lambda的公网IP(公网访问场景)或配置好VPC peering(内网访问场景)。
- 依赖包一致性:本地开发使用的
mongodb包版本,要和Lambda部署包里的版本保持一致,避免版本差异引发异步行为异常。 - 错误捕获完整性:原代码中
run().catch(console.dir)在Lambda进程提前终止的情况下,可能无法输出完整错误信息,改为在handler内部用try/catch包裹,确保错误能被完整记录。
内容的提问来源于stack exchange,提问作者SmolTeddu
相关产品推荐
相关产品推荐

