解构securityContext时返回undefined,如何排查问题并简化代码?
问题成因
你写的嵌套解构语法本身没有语法错误,问题出在你对解构语法的变量声明规则理解有误:
const { securityContext : { apiKey, securityType } } = securityContextConfigurations;
这段代码的执行逻辑是:从securityContextConfigurations对象中取出securityContext属性的值,再从这个值里解构出apiKey和securityType两个变量。此处的securityContext是被匹配的源对象属性名,不属于被声明的变量,不会被定义到当前作用域,所以你后续直接访问securityContext返回undefined是正常表现。
修复方案
方案1:分两步解构(可读性最高,推荐)
先声明securityContext变量,再解构内部字段,逻辑清晰不容易出错:
// 第一步先声明securityContext变量 const { securityContext } = securityContextConfigurations; // 再从securityContext中解构所需字段,加兜底避免属性不存在时报错 const { apiKey, securityType } = securityContext || {};
方案2:单次解构同时声明所有变量(语法精简)
如果要一次解构拿到所有需要的变量,可以用如下写法:
const { securityContext, securityContext: { apiKey, securityType } = {} } = securityContextConfigurations;
这段代码会同时在作用域中声明securityContext、apiKey、securityType三个变量。
方案3:结合lodash优化容错(适合生产环境)
因为你已经在项目中使用了lodash,可以直接用_.get处理属性不存在的兜底逻辑,代码更健壮:
const securityContext = _.get(securityContextConfigurations, 'securityContext', {}); const { apiKey, securityType } = securityContext;
整体代码简化示例
优化后的完整代码增加了容错处理,避免属性不存在时程序抛错:
const apiConfig = JSON.parse(process.env.apiConfig || '{}'); const securityContext = _.get(apiConfig, 'agpAPIs.securityContext', {}); const { apiKey, securityType } = securityContext; const { serviceContext } = apiConfig || {}; serviceContext?.refID && (serviceContext.refID = v5(serviceContext.refID, v1())); return Promise.resolve({ securityContext: { apiKey, securityType }, serviceContext });
内容的提问来源于stack exchange,提问作者jake
相关产品推荐
相关产品推荐

