AWS Lambda返回内部服务器错误且无CloudWatch日志排查
问题排查方向
1. 异步操作未等待,引发未捕获的Promise拒绝
你的代码里调用findOne时没加await:
response = client.methods .collection<Project>("projects") .findOne({ path: headers?.project_path });
这会导致这个异步查询在函数返回后才执行,如果查询抛出错误,属于未捕获的Promise拒绝,Lambda会直接崩溃,甚至来不及写入CloudWatch日志。同时当前GET分支里没有返回有效响应,函数会走到最后的400响应,但Promise拒绝会触发API Gateway返回500错误。
修复:给findOne加await,并返回正确响应:
try { response = await client.methods .collection<Project>("projects") .findOne({ path: headers?.project_path }); return { statusCode: 200, body: JSON.stringify(response || { message: "项目未找到" }) }; } catch (err: any) { return { statusCode: 500, body: JSON.stringify({ error: err.message }) }; }
2. MongoDB连接逻辑未做错误捕获
mongoClient()初始化或await client.connect()如果抛出错误,这部分代码没有被try/catch包裹,会导致Lambda在初始化阶段崩溃,可能还没执行到console.log就挂了,自然不会生成日志。
修复:把连接逻辑放进try/catch:
export const handler: Handler = async (event: APIGatewayEvent) => { console.log("Lambda running"); let client; try { client = mongoClient(); await client.connect(); } catch (err) { console.error("MongoDB连接失败:", err); return { statusCode: 500, body: JSON.stringify({ error: "数据库连接失败" }) }; } // 后续GET逻辑... }
3. API Gateway与Lambda集成配置错误
如果API Gateway没正确配置Lambda集成,可能返回500但Lambda根本没触发:
- 直接在Lambda控制台测试函数,传入模拟的APIGatewayEvent,看是否能正常执行并生成日志。
- 检查API Gateway的集成请求配置,确认Lambda函数ARN正确,且启用了代理集成(如果用的是代理模式)。
4. esbuild编译兼容性问题
使用--platform=node编译时,需确保:
- 编译后的JS文件包含了所有依赖(比如MongoDB驱动是否被正确打包)。
tsconfig.json的target版本与Node.js 20兼容(比如设为ES2020)。
5. CloudWatch日志权限或延迟问题
虽然配置了日志权限,但可能存在:
- Lambda执行角色的权限未生效,重新部署Lambda或检查IAM角色的信任策略是否允许Lambda服务使用该角色。
- CloudWatch日志有延迟,等待几分钟后再查看,或确认日志组是否为
/aws/lambda/[你的Lambda函数名]。
内容的提问来源于stack exchange,提问作者Ethan
相关产品推荐
相关产品推荐

