【问题标题】:(hashlips_art_engine-1.1.2_patch_v5) The "path" argument must be of type string. Received undefined(hashlips_art_engine-1.1.2_patch_v5) \"path\" 参数必须是字符串类型。收到未定义
【发布时间】:2022-08-15 00:53:05
【问题描述】:

我正在尝试更新 10 个 JSON 文件的一些元数据,其中一些得到正确更新,而另一些则给我以下错误。

您可以在下面看到 6 个文件给我错误,并且 4 个文件已正确更新。


error:TypeError [ERR_INVALID_ARG_TYPE]: \"path\" 参数必须是字符串类型。收到未定义

error:TypeError [ERR_INVALID_ARG_TYPE]: \"path\" 参数必须是字符串类型。收到未定义

error:TypeError [ERR_INVALID_ARG_TYPE]: \"path\" 参数必须是字符串类型。收到未定义

error:TypeError [ERR_INVALID_ARG_TYPE]: \"path\" 参数必须是字符串类型。收到未定义

error:TypeError [ERR_INVALID_ARG_TYPE]: \"path\" 参数必须是字符串类型。收到未定义

error:TypeError [ERR_INVALID_ARG_TYPE]: \"path\" 参数必须是字符串类型。收到未定义

5.png 上传 & 5.json 更新!

4.png 上传 & 4.json 更新!

1.png 上传 & 1.json 更新!

7.png 上传 & 7.json 更新!


这是我使用的 node.js 代码:

onst FormData = require(\'form-data\');
const fetch = require(\'node-fetch\');
const path = require(\"path\");
const basePath = process.cwd();
const fs = require(\"fs\");

fs.readdirSync(`${basePath}/build/images`).
forEach(file => {
  const formData = new FormData();
  const fileStream = fs.createReadStream(`${basePath}/build/images/${file}`);
  formData.append(\"file\", fileStream);

  let url = \'https://api.nftport.xyz/v0/files\';

  let options = {
    method: \'POST\',
    headers: {
      Authorization: \'SecretApiCode\',
    },
    body: formData
  };

  fetch(url, options)
    .then(res => res.json())
    .then((json) => {
      const fileName = path.parse(json.file_name).name;
      let rawdata = fs.readFileSync(`${basePath}/build/json/${fileName}.json`);
      let metaData = JSON.parse(rawdata);

      metaData.file_url = json.ipfs_url;

      fs.writeFileSync(`${basePath}/build/json/${fileName}.json`,
        JSON.stringify(metaData, null, 2));

      console.log(`${json.file_name} uploaded & ${fileName}.json updated!`);
      })
    .catch(err => console.error(\'error:\' + err));

});

我有 10png 文件:

1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png

和 10 个 JSON 文件

1.json 2.json 3.json 4.json 5.json 6.json 7.json 8.json 9.json 10.json

    标签: javascript node.js nft


    【解决方案1】:

    问题在您的代码中似乎与获取 URL 相关。

    事实证明,有时,您的代码会因错误而失败,有时,它会成功运行。

    可能发生的情况是,有时,当您从 URL 获取数据时,它可能没有 file_name 属性(由于错误等)

    当您尝试使用以下方法解析路径时:

    path.parse(json.file_name);
    

    file_name 可能是 undefined,因为可能没有这样的密钥。而且,由于path.parse() 无法解析undefined,它返回一个错误,说in 只接受strings(如下所示)。

    TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received undefined
    

    有很多可能解决方案, 所以他们在下面列出。

    • 添加检查file_name 是否可用。如果不是,请不要尝试使用path.parse() 解析它。您可以使用下面的代码来检查它(在第二个.then() 方法中)。

      if (!json.file_name) {
        console.error("Error fetching file name.");
        return;
      }
      
    • 如果您的 API 支持它,请检查响应正文中是否存在错误。假设错误类似于.error,您可以使用下面的代码作为指导(将其添加到第二个.then() 方法中)。

      if (!json.file_name && json.error) {
        console.log(json.error.message);
        return;
      }
      
    • 可能还有许多其他(更好的)解决方案,但这些解决方案只是为您提供一个起点。

    解决方案 1 和 2 非常相似,但它们在不同的情况下工作。

    【讨论】:

    • 嗨,Arnav,我有点卡住了。在fetch 部分,我按照您所说的if (!json.file_name) 进行了检查,实际上我似乎无法获取文件名,因为我在控制台中收到了此检查的错误,但不确定为什么某些文件名没有被获取为他人做,以及如何解决它。
    • fetch(url, options) .then(res => res.json()) .then((json) => { if (!json.file_name) { console.error("Error fetching file name."); return; }
    • 并获得以下日志: 获取文件名时出错。获取文件名时出错。获取文件名时出错。获取文件名时出错。获取文件名时出错。获取文件名时出错。获取文件名时出错。 10.png 上传 & 10.json 更新! 5.png 上传 & 5.json 更新! 4.png 上传 & 4.json 更新!
    【解决方案2】:

    尝试这个。如果您将标签更改为 v1.2.0,您还可以在 codeSTACKr/create-10k-nft-collection" git 存储库中找到它。

    这是在uploadfiles.js

    const FormData = require("form-data");
    const fetch = require("node-fetch");
    const path = require("path");
    const basePath = process.cwd();
    const fs = require("fs");
    
    const AUTH = 'Your API KEY GOES HERE';
    const TIMEOUT = 1000; // Milliseconds. Extend this if needed to wait for each upload. 1000 = 1 second.
    
    const allMetadata = [];
    
    async function main() {
      const files = fs.readdirSync(`${basePath}/build/images`);
      files.sort(function(a, b){
        return a.split(".")[0] - b.split(".")[0];
      });
      for (const file of files) {
        const fileName = path.parse(file).name;
        let jsonFile = fs.readFileSync(`${basePath}/build/json/${fileName}.json`);
        let metaData = JSON.parse(jsonFile);
        if(!metaData.file_url.includes('https://')) {
          const response = await fetchWithRetry(file);
          metaData.file_url = response.ipfs_url;
      
          fs.writeFileSync(
            `${basePath}/build/json/${fileName}.json`,
            JSON.stringify(metaData, null, 2)
          );
          console.log(`${response.file_name} uploaded & ${fileName}.json updated!`);
        } else {
          console.log(`${fileName} already uploaded.`);
        }
    
        allMetadata.push(metaData);
      }
      fs.writeFileSync(
        `${basePath}/build/json/_metadata.json`,
        JSON.stringify(allMetadata, null, 2)
      );
    }
    
    main();
    
    function timer(ms) {
      return new Promise(res => setTimeout(res, ms));
    }
    
    async function fetchWithRetry(file)  {
      await timer(TIMEOUT)
      return new Promise((resolve, reject) => {
        const fetch_retry = (_file) => {
          const formData = new FormData();
          const fileStream = fs.createReadStream(`${basePath}/build/images/${_file}`);
          formData.append("file", fileStream);
    
          let url = "https://api.nftport.xyz/v0/files";
          let options = {
            method: "POST",
            headers: {
              Authorization: AUTH,
            },
            body: formData,
          };
    
          return fetch(url, options).then(async (res) => {
              const status = res.status;
    
              if(status === 200) {
                return res.json();
              }            
              else {
                console.error(`ERROR STATUS: ${status}`)
                console.log('Retrying')
                await timer(TIMEOUT)
                fetch_retry(_file)
              }            
          })
          .then(async (json) => {
            if(json.response === "OK"){
              return resolve(json);
            } else {
              console.error(`NOK: ${json.error}`)
              console.log('Retrying')
              await timer(TIMEOUT)
              fetch_retry(_file)
            }
          })
          .catch(async (error) => {  
            console.error(`CATCH ERROR: ${error}`)  
            console.log('Retrying')    
            await timer(TIMEOUT)    
            fetch_retry(_file)
          });
        }        
        return fetch_retry(file);
      });
    }
    

    【讨论】:

      猜你喜欢
      • 2021-06-10
      • 1970-01-01
      • 2022-09-29
      • 2019-11-27
      • 2019-11-10
      • 2021-09-08
      • 2020-08-10
      • 2020-12-30
      • 2019-05-13
      相关资源
      最近更新 更多