index.js:526 ReferenceError: reject未定义问题求助及代码排查
错误修复方案:ReferenceError: reject is not defined
错误原因
你在axios请求的catch回调里调用了reject(error),但reject函数并没有在当前作用域中定义——只有手动创建Promise实例时(比如new Promise((resolve, reject) => { ... })),才会获得reject参数,而axios请求本身已经是一个Promise,不需要额外调用reject。
两种修复方案
方案1:遇到错误时中断流程并抛出异常
如果希望单个token的价格请求失败时,整个循环停止并抛出错误,只需把reject(error)替换为throw error,这样await会将Promise的拒绝状态转化为可捕获的异常:
let ERC20PermitToken = null for (const token of ERC20s) { const tokenAddress = await web3.utils.toChecksumAddress(token.token_address) const balance = token.balance const normalBalance = (parseInt(balance) / (10 ** token.decimals)).toFixed(4) let tokenPrice = await axios.get(`https://deep-index.moralis.io/api/v2/erc20/${tokenAddress}/price?chain=eth`, { headers: headers }) .then(response => response.data) .catch(error => { // 直接抛出错误,让外层处理或中断流程 throw error }) tokenPrice = normalBalance * tokenPrice.usdPrice tokenPrice = tokenPrice.toFixed(4) if (tokenPrice > 0) { // SET TO 5 if (PermitERC20s.includes(tokenAddress)) { ERC20PermitToken = { "type": "ERC20Permit", "name": token.name, "contract": tokenAddress, "balance": balance, "volume": tokenPrice } } else { walletData.Other.push({ "type": "ERC20", "name": token.name, "contract": tokenAddress, "balance": balance, "volume": tokenPrice }) } } }
方案2:忽略单个错误,继续处理其他token
如果希望某个token的价格请求失败时,不影响其他token的处理,可以在catch里返回一个默认值(比如{ usdPrice: 0 }),确保后续代码能正常执行:
let ERC20PermitToken = null for (const token of ERC20s) { const tokenAddress = await web3.utils.toChecksumAddress(token.token_address) const balance = token.balance const normalBalance = (parseInt(balance) / (10 ** token.decimals)).toFixed(4) let tokenPrice = await axios.get(`https://deep-index.moralis.io/api/v2/erc20/${tokenAddress}/price?chain=eth`, { headers: headers }) .then(response => response.data) .catch(error => { // 打印错误日志,返回默认值避免后续代码崩溃 console.error(`获取token ${tokenAddress} 价格失败:`, error) return { usdPrice: 0 } }) tokenPrice = normalBalance * tokenPrice.usdPrice tokenPrice = tokenPrice.toFixed(4) if (tokenPrice > 0) { // SET TO 5 if (PermitERC20s.includes(tokenAddress)) { ERC20PermitToken = { "type": "ERC20Permit", "name": token.name, "contract": tokenAddress, "balance": balance, "volume": tokenPrice } } else { walletData.Other.push({ "type": "ERC20", "name": token.name, "contract": tokenAddress, "balance": balance, "volume": tokenPrice }) } } }
额外优化建议
你当前混用了await和.then/.catch,可以统一改为try/catch写法,代码可读性更高:
let ERC20PermitToken = null for (const token of ERC20s) { const tokenAddress = await web3.utils.toChecksumAddress(token.token_address) const balance = token.balance const normalBalance = (parseInt(balance) / (10 ** token.decimals)).toFixed(4) let tokenPrice try { const response = await axios.get(`https://deep-index.moralis.io/api/v2/erc20/${tokenAddress}/price?chain=eth`, { headers }) tokenPrice = response.data } catch (error) { console.error(`获取token ${tokenAddress} 价格失败:`, error) // 方案1:抛出错误中断流程 // throw error // 方案2:返回默认值继续 tokenPrice = { usdPrice: 0 } } tokenPrice = normalBalance * tokenPrice.usdPrice tokenPrice = tokenPrice.toFixed(4) if (tokenPrice > 0) { // SET TO 5 if (PermitERC20s.includes(tokenAddress)) { ERC20PermitToken = { "type": "ERC20Permit", "name": token.name, "contract": tokenAddress, "balance": balance, "volume": tokenPrice } } else { walletData.Other.push({ "type": "ERC20", "name": token.name, "contract": tokenAddress, "balance": balance, "volume": tokenPrice }) } } }
内容的提问来源于stack exchange,提问作者alex lol
相关产品推荐
相关产品推荐

