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