Search code examples
node.jsnode-fetches6-modules

How can I resolve ERR_REQUIRE_ESM error when using this simple node-fetch query?


I am trying to do a simple API fetch using node-fetch.

Getting the following error:

internal/modules/cjs/loader.js:1089
      throw new ERR_REQUIRE_ESM(filename, parentPath, packageJsonPath);
      ^

Error [ERR_REQUIRE_ESM]: Must use import to load ES Module: C:\Users\raben\OneDrive\Work\PowerBI Embedded\Fetch_PBI_Access_Token\node_modules\node-fetch\src\index.js
require() of ES modules is not supported.
require() of C:\Users\raben\OneDrive\Work\PowerBI Embedded\Fetch_PBI_Access_Token\node_modules\node-fetch\src\index.js from C:\Users\raben\OneDrive\Work\PowerBI Embedded\Fetch_PBI_Access_Token\index.js is an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which defines all .js files in that package scope as ES modules.
Instead rename C:\Users\raben\OneDrive\Work\PowerBI Embedded\Fetch_PBI_Access_Token\node_modules\node-fetch\src\index.js to end in .cjs, change the requiring code to use import(), or remove "type": "module" from C:\Users\raben\OneDrive\Work\PowerBI Embedded\Fetch_PBI_Access_Token\node_modules\node-fetch\package.json.

←[90m    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1089:13)←[39m
←[90m    at Module.load (internal/modules/cjs/loader.js:937:32)←[39m
←[90m    at Function.Module._load (internal/modules/cjs/loader.js:778:12)←[39m
←[90m    at Module.require (internal/modules/cjs/loader.js:961:19)←[39m
←[90m    at require (internal/modules/cjs/helpers.js:92:18)←[39m
    at Object.<anonymous> (C:\Users\raben\OneDrive\Work\PowerBI Embedded\Fetch_PBI_Access_Token\index.js:2:15)
←[90m    at Module._compile (internal/modules/cjs/loader.js:1072:14)←[39m
←[90m    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)←[39m
←[90m    at Module.load (internal/modules/cjs/loader.js:937:32)←[39m
←[90m    at Function.Module._load (internal/modules/cjs/loader.js:778:12)←[39m {
  code: ←[32m'ERR_REQUIRE_ESM'←[39m
}

My node version is v14.17.6

I have installed node-fetch

Here is my index.js:

const Fetch = require('node-fetch')

fetch("https://api.github.com/users")
    .then((res) => res.json())
    .then((res) => console.log(res));

Here is my package.json:

{
  "name": "Fetch_PBI_Access_Token",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "node-fetch": "^3.0.0"
  }
}

If I add "type": "module" I then get the following error:

 This file is being treated as an ES module because it has a '.js' file extension and 'C:\Users\raben\OneDrive\Work\PowerBI Embedded\Fetch_PBI_Access_Token\package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.
        at file:///C:/Users/raben/OneDrive/Work/PowerBI%20Embedded/Fetch_PBI_Access_Token/index.js:2:15
    ←[90m    at ModuleJob.run (internal/modules/esm/module_job.js:170:25)←[39m
    ←[90m    at async Loader.import (internal/modules/esm/loader.js:178:24)←[39m
    ←[90m    at async Object.loadESM (internal/process/esm_loader.js:68:5)←[39m

Solution

  • The error really says it all. Since node-fetch is an ES module, you shouldn't use the require syntax to import it, but the import syntax:

    import fetch from 'node-fetch';
    

    Note:
    Older versions of node-fetch are still CommonJS packages (i.e., can be used with require), so if you downgrade your dependency to some 2.x version, your code should work as-is.