Node.js中传ApiId/ApiName给自定义函数返回undefined如何解决?
问题根因
你的报错和name参数的封装无关,是两个代码逻辑错误导致的:
dimensionValue函数没有做匹配失败的防御处理:Array.prototype.find在未找到匹配项时会返回undefined,你直接访问.value属性自然会触发Cannot read property 'value' of undefined报错。- 分支判断逻辑完全错误:
else if分支中你使用了未初始化的变量sns_DimensionsValue和find返回的维度对象做相等判断,该条件永远不成立,会触发错误分支调用dimensionValue查询不存在的维度名,最终触发报错。
你单独执行语句可以正常返回,是因为你测试时用的ApiId是当前环境确实存在的维度,find可以正常匹配到结果。
修复方案
1. 改造dimensionValue函数增加判空逻辑
function dimensionValue(name) { console.log("Testing") const targetDimension = sns.Trigger.Dimensions.find(dimension => dimension.name === name) // 匹配不到时返回空字符串作为默认值,也可根据你的业务需要调整默认值 return targetDimension ? targetDimension.value : '' }
2. 修正分支判断逻辑
if (sns.Trigger.Namespace == "AWS/ApiGateway") { console.log("Testing2") // 提前提取所有维度的存在状态,避免重复执行find const hasApiId = sns.Trigger.Dimensions.find(dimension => dimension.name === 'ApiId') const hasApiName = sns.Trigger.Dimensions.find(dimension => dimension.name === 'ApiName') const hasStage = sns.Trigger.Dimensions.find(dimension => dimension.name === 'Stage') let sns_DimensionsValue = '' if (hasApiId && hasStage) { console.log('ApiId and Stage') sns_DimensionsValue = dimensionValue('ApiId') + '_' + dimensionValue('Stage') } else if (hasApiName && hasStage) { console.log('ApiName and Stage') sns_DimensionsValue = dimensionValue('ApiName') + '_' + dimensionValue('Stage') } else if (hasApiId) { console.log('ApiId') sns_DimensionsValue = dimensionValue('ApiId') } else if (hasApiName) { console.log('ApiName') sns_DimensionsValue = dimensionValue('ApiName') } }
内容的提问来源于stack exchange,提问作者user630702
相关产品推荐
相关产品推荐

