javascript - Istället för att ändra kravet på index.js, använd en dynamisk import() som är tillgänglig i alla CommonJS-moduler


Försöker arbeta med node/javascript/nfts, jag är nybörjare och följde en handledning, men jag får detta fel:

error [ERR_REQUIRE_ESM]: require() of ES Module [...] is not supported. Instead change the require of index.js [ in my file...]  to a dynamic import() which is available in all CommonJS modules

Min förståelse är att de har uppdaterat node-filen, så jag behöver en annan kod än den i handledningen, men jag vet inte vilken jag ska ändra, var och till vad. Var så specifik som möjligt

const 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).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: '[...]',
      },
      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));
})

Svar #1

Det beror på node-fetch-paketet. Eftersom de senaste versionerna av detta paket endast stöder ESM; måste du nedgradera det till en äldre version [email  eller lägre.

npm i [email 

Detta bör lösa problemet.

Svar #2

Ingen anledning att använda den gamla versionen. Du kan använda denna rad istället för "kräva".

const fetch = (...args) => import('node-fetch').then(({default: fetch}) => fetch(...args));

Svar #3

Detta kan inträffa när du installerar den senaste versionen av ett paket som har ett problem med modulimport.

I mitt fall fick jag felet efter att ha installerat den senaste versionen av crypto-random-string-paketet. För att veta vilket paket som orsakar detta fel, kontrollera meddelandet som föregår felet som rapporterades ovan. I mitt fall stod det så här: error: uncaughtException: require() of ES Module /Users/myname/Documents/mydir/anotherdir/my-project/node_modules/crypto-random-string/index.js

För att fixa det nedgraderade jag bara till en tidigare version genom att göra följande:

  1. yarn remove crypto-random-string
  2. yarn add [email 

Svar #4

Gå till din package.json-fil och skriv:

"type": "module",

ovanför felsökning.

och istället för att skriva require('chalk') i .js-filen, ändra det till import chalk from 'chalk'

Relaterade artiklar