函数参数addy在API请求模板字符串中引用时提示未定义问题
问题解决:ReferenceError: addy is not defined
原始代码
const getAbi = async (addy) => { const url = `https://api.arbiscan.io/api?module=contract&action=getabi&address=${addy}&apikey=${arbiscanKey}`; const abi = await axios.get(url); console.log(abi); return abi; };
报错信息
const arbiscanGetAbi = `https://api.arbiscan.io/api?module=contract&action=getabi&address=${addy}&apikey=${arbiscanKey}`; ^ ReferenceError: addy is not defined
问题原因
报错里的arbiscanGetAbi变量是在函数作用域外部定义的,而addy是getAbi函数的参数,只有在函数内部才能访问到。实际运行的代码和你贴出的原始代码不一致——应该是把原本在函数内的url变量改成了全局的arbiscanGetAbi,导致模板字符串执行时找不到addy。
解决方法
1. 恢复函数内定义模板字符串
确保包含${addy}的模板字符串定义在getAbi函数内部,这样就能正常访问函数参数:
const getAbi = async (addy) => { // 模板字符串在函数内部,可访问addy参数 const url = `https://api.arbiscan.io/api?module=contract&action=getabi&address=${addy}&apikey=${arbiscanKey}`; const abi = await axios.get(url); console.log(abi.data); // 实际ABI数据在响应的data属性中 return abi.data; };
2. 适配多版本API域名
如果需要动态切换不同网站版本的API,可把域名做成参数或配置变量,同样在函数内引用:
// 外部定义多环境API域名配置 const apiConfigs = { mainnet: 'https://api.arbiscan.io', testnet: 'https://api-testnet.arbiscan.io' }; const getAbi = async (addy, env = 'mainnet') => { const baseUrl = apiConfigs[env]; const url = `${baseUrl}/api?module=contract&action=getabi&address=${addy}&apikey=${arbiscanKey}`; const abi = await axios.get(url); return abi.data; }; // 调用示例:获取测试网合约ABI getAbi('0x...', 'testnet');
额外注意
- 确认
arbiscanKey在函数作用域内可访问,如果是私有密钥,建议作为参数传入函数,避免全局暴露。 - axios请求返回的是完整响应对象,实际的ABI数据存储在
response.data中,直接返回原响应对象可能不符合预期。
内容的提问来源于stack exchange,提问作者Ofir Smolinsky
相关产品推荐
相关产品推荐

