调用 /mint_nft NEAR REST API 时出现 500 内部服务器错误

Getting 500 Internal Server Error when calling /mint_nft NEAR REST API

我已将此 NEAR REST API SERVER 存储库克隆到我的本地系统中,并且未对其原始代码进行任何更改。仅添加用于调试目的的控制台日志。使用它的 API,我已经成功地将一个合约部署到测试网帐户并调用了该合约。

但是说到 NFT 部分,它不起作用。 我正在调用 /mint_nft API 并收到 500 内部服务器错误。

这里坏了:

let create_token = await token.ViewNFT(tokenId, contract);

create_token 为空。


如果我使用 NEAR CLI 进行铸造,它工作正常,我可以在我的测试网钱包中看到 NFT..

near call $ID nft_mint '{"token_id": "02", "receiver_id": "'$ID'", "token_metadata": { "title": "Design #2", "description": "Art Design", "media": "https://ipfs.io/ipfs/Qme7ss3ARVgxv6rXqVPiikMJ8u2NLgmgszg13pYrDKEoiu", "copies": 1}}' --accountId $ID --deposit 0.1


近-api-server.config.json

{
  "server_host": "localhost",
  "server_port": 9000,
  "rpc_node": "https://rpc.testnet.near.org",
  "init_disabled": false,
  "master_account_id": "parimal9.testnet",
  "master_key": "ed25519:2bUSD2v88RiwznraL1ZYtduH2rsJqbrE8K6QT2asnsPnXHc171Qj4khvxFxZqb6AN6zyiZzo4j7f9amooFi7kJX1",
  "nft_contract": "nft.parimal9.testnet"
}


我也尝试过这种方式,但仍然无法正常工作。


server.route({
        method: 'POST',
        path: '/mint_nft',
        handler: async (request) => {
            console.log('\n\n\nMINT_NFT_PAYLOAD:', request.payload);
            let {min, max} = request.payload;

            if (!min || !max) min = max = 0;
            let response = [];

            request = processRequest(request);
            for (let i = min; i <= max; i++) {
                const tokenId = request.payload.token_id.replace('{inc}', i);
                console.log('tokenId:', tokenId);

                let {account_id, private_key, metadata, contract} = request.payload;

                const tx = await token.MintNFT(
                    tokenId,
                    metadata,
                    contract,
                    account_id,
                    private_key
                );

                if (tx) {
                    if (min === max) {
                        console.log('tokenId:', tokenId);
                        let create_token = await token.ViewNFT(tokenId, contract);
                        console.log('create_token:', create_token, '\n\n\n');
                        create_token.token_id = tokenId;
                        console.log('create_token.token_id:', tokenId, '\n\n\n');
                        response.push({token: create_token, tx: tx});
                    } else {
                        response.push({tx: tx});
                    }
                } else {
                    response.push({text: 'Error. Check backend logs.'});
                }
            }

            return response;
        },
    });

/mint_nft 的现有存储库中存在几个问题。

实施的 REST-API 在铸造 NFT 时没有遵循正确的格式。 我创建了一个 PR to address the issue

简而言之,铸造 NFT 的函数调用缺少一个参数 receiver_id,并且 metadata 的格式和名称不正确。应该是 token_metadata: {} // type is object, not string.

如果我们将 postData 更改为

{
    "token_id": "foo",
    "token_metadata": {
        "media": "https://ipfs.io/ipfs/Qme7ss3ARVgxv6rXqVPiikMJ8u2NLgmgszg13pYrDKEoiu"
    },
    "account_id": "parimal9.testnet",
    "private_key": "yourPrivateKey",
    "contract": "parimal9.testnet"
}

并对服务器代码进行一些更改,您可以在 PR I made 中看到,我们应该能够从服务器调用 /mint_nft