AWS Lambda升级NodeJS14运行时报Cannot read property 'id' of undefined
问题排查与解决方案
报错根因
从错误堆栈可以直接定位到出错位置是handler函数第11行的JSON.parse(res).ticket.id:你调用makeHTTPPost接口后返回的响应体res经过JSON解析后,不存在ticket字段,导致ticket为undefined,读取undefined的id属性就触发了这个TypeError。
该问题和Node.js版本升级无直接关联,本质是第三方接口响应不符合预期导致的。
排查步骤
- 打印完整接口返回值确认响应结构:在
let res = await makeHTTPPost(body);后新增代码console.log('接口返回原始内容:', res),重新触发Lambda运行后查看CloudWatch日志,确认是接口请求失败返回了错误结构,还是成功响应的字段命名和预期不符(比如部分接口会用data字段嵌套响应内容,或者直接把ticket_id放在根节点下)。 - 校验请求参数合法性:查看日志中打印的
event和pkc值,确认传给第三方接口的priority、subject、comment_body等必填字段是否存在空值情况,多数工单接口在参数缺失时会直接返回错误响应,不会返回标准的ticket结构。 - 检查
makeHTTPPost方法的错误处理逻辑:如果接口返回4xx/5xx类错误状态码,当前代码没有做状态判断,直接把错误响应体当做成功结果解析,也会出现结构不匹配的问题。
修复方案
- 优先加防御性取值逻辑避免直接报错:将第11行的取值逻辑修改为
JSON.parse(res)?.ticket?.id ?? '工单创建失败',就算ticket字段不存在也只会返回兜底提示,不会触发函数报错。 - 补充完整的响应校验逻辑:
let res = await makeHTTPPost(body); const resData = JSON.parse(res); // 校验响应结构合法性 if (!resData || !resData.ticket || !resData.ticket.id) { response.statusCode = 500; response.body = `工单创建失败,接口返回内容:${res}`; return response; } response.body = `Created Ticket Number: ${resData.ticket.id}`
- 补充参数校验逻辑:给
createJSONBody中的必填字段增加非空校验或者默认值,避免因参数缺失导致接口请求失败。
内容的提问来源于stack exchange,提问作者Jonathan P
相关产品推荐
相关产品推荐

