如何修复“未处理的运行时错误类型错误:事件未定义”

Posted

技术标签:

【中文标题】如何修复“未处理的运行时错误类型错误:事件未定义”【英文标题】:How to fix "Unhandled Runtime Error TypeError: event is undefined" 【发布时间】:2022-01-15 11:14:40 【问题描述】:

今天我遇到问题Unhandled Runtime Error TypeError: event is undefined 并在互联网上一无所获 代码:

import  ethers  from 'ethers'
import  create as ipfsHttpClient  from 'ipfs-http-client'
import  useRouter  from 'next/router'
import Web3Modal from 'web3modal'

const client = ipfsHttpClient('https://ipfs.infura.io:5001/api/v0')

import 
  nftaddress, nftmarketaddress
 from '../config'

import NFT from '../artifacts/contracts/NFT.sol/NFT.json'
import Market from '../artifacts/contracts/Market.sol/NFTMarket.json'
export default function CreateItem() 
  const [fileUrl, setFileUrl] = useState(null)
  const [formInput, updateFormInput] = useState( price: '', name: '', description: '' )
  const router = useRouter()

  async function onChange(e) 
    const file = e.target.files[0]
    try 
      const added = await client.add(
        file,
        
          progress: (prog) => console.log(`received: $prog`)
        
      )
      const url = `https://ipfs.infura.io/ipfs/$added.path`
      setFileUrl(url)
     catch (error) 
      console.log('Error uploading file: ', error)
    
  
  async function createMarket() 
    const  name, description, price  = formInput
    if (!name || !description || !price || !fileUrl) return
    /* first, upload to IPFS */
    const data = JSON.stringify(
      name, description, image: fileUrl
    )
    try 
      const added = await client.add(data)
      const url = `https://ipfs.infura.io/ipfs/$added.path`
      /* after file is uploaded to IPFS, pass the URL to save it on Polygon */
      createSale(url)
     catch (error) 
      console.log('Error uploading file: ', error)
    
  

正是在这个函数中产生了一个错误(即在let event = tx.events[0]let value = event.args[2]这行)

async function createSale(url) 
    const web3Modal = new Web3Modal()
    const connection = await web3Modal.connect()
    const provider = new ethers.providers.Web3Provider(connection)
    const signer = provider.getSigner()

    /* next, create the item */
    let contract = new ethers.Contract(nftaddress, NFT.abi, signer)
    let transaction = await contract.createToken(url)
    let tx = await transaction.wait()
    let event = tx.events[0]
    let value = event.args[2]
    let tokenId = value.toNumber()
    const price = ethers.utils.parseUnits(formInput.price, 'ether')

    /* then list the item for sale on the marketplace */
    contract = new ethers.Contract(nftmarketaddress, Market.abi, signer)
    let listingPrice = await contract.getListingPrice()
    listingPrice = listingPrice.toString()

    transaction = await contract.createMarketItem(nftaddress, tokenId, price,  value: listingPrice )
    await transaction.wait()
    router.push('/')
  

代码结束

return (
    <div className="flex justify-center">
      <div className="w-1/2 flex flex-col pb-12">
        <input
          placeholder="Asset Name"
          className="mt-8 border rounded p-4"
          onChange=e => updateFormInput( ...formInput, name: e.target.value )
        />
        <textarea
          placeholder="Asset Description"
          className="mt-2 border rounded p-4"
          onChange=e => updateFormInput( ...formInput, description: e.target.value )
        />
        <input
          placeholder="Asset Price in Eth"
          className="mt-2 border rounded p-4"
          onChange=e => updateFormInput( ...formInput, price: e.target.value )
        />
        <input
          type="file"
          name="Asset"
          className="my-4"
          onChange=onChange
        />
        
          fileUrl && (
            <img className="rounded mt-4"  src=fileUrl />
          )
        
        <button onClick=createMarket className="font-bold mt-4 bg-pink-500 text-white rounded p-4 shadow-lg">
          Create Digital Asset
        </button>
      </div>
    </div>
  )

【问题讨论】:

你应该检查tx.events[0]是否是undefined,而不是仅仅假设它是。 【参考方案1】:

解决方案非常简单。您只需要在event中添加/删除一个字母

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于如何修复“未处理的运行时错误类型错误:事件未定义”的主要内容,如果未能解决你的问题,请参考以下文章

如何修复drv?

如何修复漏洞

如何修复WMI

PHP网站漏洞怎么修复 如何修补网站程序代码漏洞

如何修复这些漏洞? (npm audit fix 无法修复这些漏洞)

如何修复AppScan漏洞