Lambda执行时触发TypeError: Cannot read properties of undefined (reading '0')错误求助
Lambda执行时触发TypeError: Cannot read properties of undefined (reading '0')错误求助
嘿,我来帮你拆解这个问题!你遇到的TypeError,本质是代码尝试访问event['Records'][0]时,event['Records']本身是undefined,自然没法读取索引0。结合你提供的日志和代码,咱们一步步解决:
问题根源分析
从错误栈能看到,报错点就在index.mjs第14行的event['Records'][0]['cf']这行代码。你给出的正常请求日志显示,正常情况下CloudFront触发的Lambda事件是带有Records数组的,但某些场景下(比如测试事件配置错了、触发源异常、个别请求格式不符合预期),Lambda收到的event对象里并没有Records属性,才导致了崩溃。
解决方案
1. 给代码加安全的空值检查(最优先处理)
直接链式访问嵌套属性很容易踩坑,咱们用JavaScript的**可选链操作符?.**做安全访问,再加上兜底的错误处理:
// 安全读取嵌套属性,任何一层不存在都会返回undefined const request = event?.Records?.[0]?.cf; // 如果request不存在,说明事件结构异常,做兜底处理 if (!request) { console.error("收到的事件结构异常:缺少Records[0].cf"); // 针对CloudFront的Lambda@Edge,返回一个标准错误响应 return { status: '500', statusDescription: 'Internal Server Error', headers: { 'content-type': [{ key: 'Content-Type', value: 'text/plain' }] }, body: '服务器内部错误' }; }
这样即使事件结构不符合预期,代码也不会崩溃,还能输出日志方便后续排查。
2. 确认Lambda的触发源和测试模板
如果你是用Lambda@Edge配合CloudFront,要注意两个关键点:
- CloudFront的行为配置里,已经正确关联你的Lambda函数,且事件类型(比如origin-response)和代码逻辑匹配
- 测试Lambda时,一定要用CloudFront专属事件模板,普通Lambda测试模板里是没有
Records数组的,这是很多新手踩的坑!
3. 打印完整事件结构排查
可以在代码最开头加一行日志,把收到的完整event对象打出来,这样异常请求的结构一目了然:
// 打印完整事件,方便排查异常结构 console.log("收到的完整事件:", JSON.stringify(event, null, 2));
之后再遇到报错,就能从日志里清楚看到event里到底有没有Records,以及它的实际格式,更快定位问题。
备注:内容来源于stack exchange,提问作者Suresh Rajendran
相关产品推荐
相关产品推荐

