NFT minter本地运行报'tokenURI' is not defined no-undef错误求解
报错原因
'tokenURI' is not defined no-undef是JS块级作用域导致的访问错误,你的代码存在两处核心结构问题:
tokenURI是在mintNFT函数内部用const声明的局部变量,函数外的代码无权访问该变量- 合约初始化、交易构造、签名上链的核心铸造逻辑全部写在了
mintNFT函数外部,页面加载时就会执行,既不符合点击按钮才触发铸造的业务逻辑,也必然找不到函数内部声明的tokenURI变量。
修复方法
将所有铸造相关的交易逻辑全部移动到mintNFT函数内部,放在const tokenURI = pinataResponse.pinataUrl;语句之后,删除函数外零散的交易相关代码即可。
修复后的完整mintNFT函数代码如下:
export const mintNFT = async(url, name, description) => { // 入参合法性校验 if (url.trim() === "" || name.trim() === "" || description.trim() === "") { return { success: false, status: "❗铸造前请填写所有字段", } } // 构造NFT元数据 const metadata = {}; metadata.name = name; metadata.image = url; metadata.description = description; // 上传元数据到IPFS const pinataResponse = await pinJSONToIPFS(metadata); if (!pinataResponse.success) { return { success: false, status: "😢元数据上传失败,请重试", } } const tokenURI = pinataResponse.pinataUrl; // 初始化合约实例 window.contract = new web3.eth.Contract(contractABI, contractAddress); // 构造链上交易参数 const transactionParameters = { to: contractAddress, from: window.ethereum.selectedAddress, data: window.contract.methods.mintNFT(window.ethereum.selectedAddress, tokenURI).encodeABI() }; // 调起MetaMask签名并发送交易 try { const txHash = await window.ethereum.request({ method: 'eth_sendTransaction', params: [transactionParameters], }); return { success: true, status: "✅ 交易已发送,可在区块浏览器查看交易哈希:" + txHash } } catch (error) { return { success: false, status: "😥 交易失败:" + error.message } } }
额外注意事项
- 不要在JS模块顶层直接写
await语句执行合约初始化、链上调用这类逻辑,这类逻辑要么放在用户触发的事件回调(比如本次的mintNFT函数)中,要么放在React的useEffect生命周期钩子里,避免页面刚加载就执行链上操作触发钱包报错。 - JS中用
const/let声明的变量为块级作用域,仅在声明它的代码块内部可访问,跨作用域访问就会触发未定义报错。
内容的提问来源于stack exchange,提问作者ky112
相关产品推荐
相关产品推荐

