You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 07:33:23