reactjs 如何在React中使用Metaplex为所有者获取Solana Nfts?错误:410

clj7thdc  于 2023-05-17  发布在  React
关注(0)|答案(2)|浏览(108)

我尝试使用Metaplex Javascript SDK为所有者获取Solana Nfts,但请求给了我以下响应:

Error: 410 Gone: {"jsonrpc":"2.0","error":{"code": 410, "message":"The RPC call or parameters have been disabled."}

我使用React-js框架和钩子。我不能迁移到Next-js,我也不使用typescript。
这是我调用的函数。这是一个标准函数,我从Web上复制了它:

const getNftsForOwnerByAddressAndChainNameSolana = async (address, chainName) => {
  const connection = new Connection(clusterApiUrl(chainName), "confirmed");
  const keypair = Keypair.generate();
  
  const metaplex = new Metaplex(connection);
  metaplex.use(keypairIdentity(keypair));
  
  const owner = new PublicKey(address);
  const allNFTs = await metaplex.nfts().findAllByOwner({ owner });
  
  console.log(allNFTs);
}

其中chainName =“mainnet-beta”;和地址是一个真实的的索拉纳地址,我可以在官方网站上探索索拉纳。
这就是答案:

Error: 410 Gone: {"jsonrpc":"2.0","error":{"code": 410, "message":"The RPC call or parameters have been disabled."}

我试图连接到集群“devnet”.因此,chainName =“devnet”;请求有一个成功响应(空数组,没有nfts),程序工作,但我需要连接到集群“mainnet-beta”,因为nfts在那里。
我还尝试了这个功能,它使用Alchemy API Key:

const getNftsForOwnerByAddressAndChainNameSolana = async (address) => {
  const rpc = "https://solana-mainnet.g.alchemy.com/v2/<ALCHEMY_API_KEY>";
  const connection = new Connection(rpc, "confirmed");
  const keypair = Keypair.generate();

  const metaplex = new Metaplex(connection);
  metaplex.use(keypairIdentity(keypair));

  const owner = new PublicKey(address);
  const allNFTs = await metaplex.nfts().findAllByOwner({ owner });
  console.log(allNFTs);
}

它返回一个空数组。
你可以看到在mainnet-beta集群上有nfts:https://explorer.solana.com/address/5VRrCiaczvcHUoRUFz7ZXzR1zpGSCBbU7rndFRYdAFYC/tokens
我在网上找了很多,但没有找到解决办法。
如何解决这个问题?这可能吗?

1wnzp6jl

1wnzp6jl1#

你的代码很可能没有错。
410 Gone表示您正在使用的RPC没有提供findAllByOwner正在使用的函数调用。
请尝试使用其他RPC来解决此问题。例如,Quicknode和extrnode对我来说工作得很好。

iqxoj9l9

iqxoj9l92#

已经变了。我是这样做的。它获取使用元数据所需的json文件信息。

import { useConnection, useWallet } from "@solana/wallet-adapter-react";
import { Metaplex, walletAdapterIdentity, FindNftsByOwnerOutput, Metadata, JsonMetadata } from "@metaplex-foundation/js";
import { FC, useEffect, useState } from "react";import Container from "../Container/Container";
import NFT from "../NFT/OPENNFTCard"

export const BagGrabber: FC = () => {
  const [nftData, setNftData] = useState<JsonMetadata[]>()
  const [selectedNft, setSelectedNft] = useState<Metadata>();
  const { connection } = useConnection();
  const wallet = useWallet();
  const metaplex = Metaplex.make(connection).use(walletAdapterIdentity(wallet));

  // fetch nfts
  const fetchNfts = async () => {
    if (!wallet.connected) {
      return
    }

    // fetch NFTs for connected wallet
    const NFTs = await metaplex.nfts().findAllByOwner({
      owner: metaplex.identity().publicKey
  });

     // fetch off chain metadata for each NFT
     let counter: number = NFTs.length;
     console.log("counter: "+counter);

    let nftData = [] as unknown as JsonMetadata[];
    let counterI= 0;
    for (var i in NFTs){
    console.log(NFTs[i].uri);
    counterI+=1;
      let fetchResult = await fetch(NFTs[i].uri)
      let json = await fetchResult.json()
      nftData.push(json)
    }

    // set state
    setNftData(nftData);
    console.log(nftData);
  }

  // fetch nfts when connected wallet changes
  useEffect(() => {
    fetchNfts()
  }, [wallet])

相关问题