首页 > 解决方案 > 将文件固定到 IPFS 时发生错误:TypeError [ERR_INVALID_ARG_TYPE]:“url”参数必须是字符串类型

问题描述

当我将文件添加到另一个项目时,我收到以下错误,我不知道为什么。

当我运行“node scripts1/runScript.js”错误时,我得到的是:

Error occurred while pinning file to IPFS:  TypeError [ERR_INVALID_ARG_TYPE]: The "url" argument must be of type string. Received undefined
    at new NodeError (node:internal/errors:371:5)
    at validateString (node:internal/validators:119:11)
    at Url.parse (node:url:169:3)
    at Object.urlParse [as parse] (node:url:156:13)
    at dispatchHttpRequest (C:\Users\alaiy\Documents\NFTs\nft-mix-main\node_modules\axios\lib\adapters\http.js:118:22)
    at new Promise (<anonymous>)
    at httpAdapter (C:\Users\alaiy\Documents\NFTs\nft-mix-main\node_modules\axios\lib\adapters\http.js:48:10)
    at dispatchRequest (C:\Users\alaiy\Documents\NFTs\nft-mix-main\node_modules\axios\lib\core\dispatchRequest.js:58:10)
    at Axios.request (C:\Users\alaiy\Documents\NFTs\nft-mix-main\node_modules\axios\lib\core\Axios.js:108:15)
    at wrap (C:\Users\alaiy\Documents\NFTs\nft-mix-main\node_modules\axios\lib\helpers\bind.js:9:15) {
  code: 'ERR_INVALID_ARG_TYPE'
}

runScript.js 代码是:

const path = require('path');
const pinFileToIPFS = require('./pinFileToIPFS');

const filePath = path.join(__dirname, '../img/Toad-Licking-Mario.jpg');
// const filePath = path.join(__dirname, '../data/metadata.json');

pinFileToIPFS(filePath);

包含“url:pinataEndpoint”的 pinFileToIPFS.js 文件我认为错误消息也指的是:

require('dotenv').config();
const fs = require('fs');
const axios = require('axios');
const FormData = require('form-data');
const { storeDataToFile } = require('./ipfsHelper.js');

// Calls Pinata API's to pin file to IPFS
const pinFileToIPFS = async (filePath) => {
  const pinataEndpoint = process.env.PINATA_ENDPOINT;
  const pinataApiKey = process.env.PINATA_API_KEY;
  const pinataApiSecret = process.env.PINATA_API_SECRET;
  const form_data = new FormData();
  try {
    form_data.append('file', fs.createReadStream(filePath));
    const request = {
      method: 'post',
      url: pinataEndpoint,
      maxContentLength: 'Infinity',
      headers: {
        pinata_api_key: pinataApiKey,
        pinata_secret_api_key: pinataApiSecret,
        'Content-Type': `multipart/form-data; boundary=${form_data._boundary}`,
      },
      data: form_data,
    };
    console.log('request:', request);
    const response = await axios(request);
    console.log('Successfully pinned file to IPFS : ', response);
    await storeDataToFile(response.data);
    console.log('Successfully added IPFS response to json file');
  } catch (err) {
    console.log('Error occurred while pinning file to IPFS: ', err);
  }
};

module.exports = pinFileToIPFS;

最后我的 .env 文件是:

# export PRIVATE_KEY=asafdagadd
# export WEB3_INFURA_PROJECT_ID=asdfsdf



# export ETHERSCAN_TOKEN=asdfasdfasdf
export IPFS_URL=blah blah
export UPLOAD_IPFS=true
export PINATA_API_KEY='blah blah'
export PINATA_API_SECRET='blah blah'
export PINATA_ENDPOINT="https://api.pinata.cloud/pinning/pinFileToIPFS"

如果需要,我也可以上传 package.json 文件。

任何帮助表示赞赏!

解决方案:原来我在 .env 文件中使用的导出语法不应该存在。导出语法适用于我之前使用的 python 脚本。

当我运行 javascript 脚本时,我删除了导出语法,一切都像魅力一样!

标签: javascriptnode.jsnpmaxiosipfs

解决方案


我遇到了同样的错误,我发现我的配置文件夹应该在我从中执行它的文件夹中。当您的 url 值未获取 env 变量时,会出现此错误。

所以在我的情况下,解决方案是这样的 -

配置/

--default.json

脚本/

--server.js

所以它在脚本文件夹中搜索配置文件夹。

后来我从脚本文件夹之外运行我的文件,然后它工作正常。

节点脚本/server.js


推荐阅读