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

本地运行正常的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 18:25:18