Cannot find module error in Node.js (Fixed)
Tags: javascript, webdev, beginners
Published: 2023-02-06 19:09:07

> ✋ **Update:** This post was originally published on my blog [decodingweb.dev](https://www.decodingweb.dev), where you can read the [latest version](https://www.decodingweb.dev/cannot-find-module-error-in-node-js-fixed) for a 💯 user experience. _~reza_

“Error: cannot find module” occurs when you try to load a non-existant [module in Node](https://www.decodingweb.dev/front-end-skills-to-become-a-pro#npm-node-package-manager) – Either via ESM (ECMAScript Modules) or CommonJS module systems. 

The error usually looks like this in the console:

```
node:internal/modules/cjs/loader:936
  throw err;
  ^

Error: Cannot find module '/var/www/scripts/app.js'
```
  
## Why does "Error: cannot find module" occur?

The error "cannot find module" might happen if you're trying to:

- Import a third-party package you haven't installed yet (with `npm` or `yarn`).
- Import a local module, but the path is wrong.
-  Run a node script in the terminal, but the script doesn't exist (or path is wrong).
- Use node standard libraries with TypeScript, but you haven't installed the `@types/node` package.
- The module's `package.json` has a main field pointing to an entry file that doesn't exist.

Before anything, let's review what a module is and how module systems work in a high level ([Or jump to the solutions](https://www.decodingweb.dev/cannot-find-module-error-in-node-js-fixed#solutions)).

**The module system:** Modules are the building blocks of an application. Node implements ESM and CommonJS (the default one) module systems to let you organize your code as reusable components. 

With modules, you can only expose the public interface of your components and keep the internal functionalities private. This is done by using a `module.exports` (CommonJS modules) or `export` (ES Modules). 

The following code is an example of a module, which has a function to determine whether a number is odd or not:

```js
// math.js

function isOdd(number) {
return number % 2 !== 0
}

// Make isOdd available to other scripts (and other modules)
module.exports = isOdd
```

And here's how we import it into another script called `index.js`:

```js
// index.js 
const add = require('./isodd.js') 

console.log(isOdd(3)) 
// output: true
```

All the modules you use have an ESM or CommonJS export declaration.

## How do module systems find modules?

If the identifier passed to `require()` or `import()` is a reference to a file (it starts with `/`, `../`, `./`, etc.) in your filesystem, Node will load it from the respective path. Otherwise, it looks it up in the installed modules - inside the `node_modules` directory.

If the module isn't found, it raises the "Cannot find module" error.

## How to fix the "Cannot find module" error in Node.js?

There are several scenarios this error can happen; Let's explore each.

**Third-party packages:** If you try to import a third-party module and get this error (and you're sure the spelling is correct), you probably haven't installed the package yet.

Imagine this is the code:

```js
//index.js

const axios = require('axios');

// Make an HTTP request with Axios
```

If I run this on my machine, I'll get the "Cannot find module" error.

And that's because I haven't installed it yet. So in my project directory (where my `package.json` resides), I'd have to install `axios` package with `npm` or `yarn` like so:

```js
npm install axios
```

**Local modules:** Imagine you have a set of utility functions kept in a JavaScript file named `utils.js`. You want to import a function called `getUrl()` from this `utils.js` into your script:

```js
// index.js

const { getUrl } = require('utils')

// Do something here ...
```

But when you run `npm run build`, the build fails:

```
ERROR in ./app/index.js 30:0-30
Module not found: Error: Can't resolve 'utils' in '/var/www/app'
```

In this case, since `utils` isn't a reference to a local file, my bundler (Webpack) assumes it's inside a `node_modules` directory. The build fails as the utils module isn't an installed package.

So what I need to do here is to make it an absolute path by adding `./` to my identifier:

```js
// index.js

const { getUrl } = require('./utils.js')

// Do something here ...
```

Problem solved.

Sometimes the error occurs because the letter casing is off. File names on Mac and Windows are case-insensitive by default; This means `./Utils` and `./utils` both work on Mac and Windows (where you develop the app). However, it'll break on a Linux file system where filenames are case-sensitive.

**Running a node script:** Another scenario reported by developers is when you run a script with the node command. However, the respective file can't be located - probably owing to a typo in the name or path.

So always double-check that the path is correct and the script exists. You can always take advantage of the terminal's autocomplete feature by typing the initial letters and pressing the tab to let it complete the path for you.

```
node ./scriptName.js
```

**Node and TypeScript:** If you're coding in TypeScript and you're importing a built-in Node module like `fs`, you might get a "Cannot find module 'fs'" error too.

You can fix the issue by installing `@types/node`:

```
npm install @types/node --save-dev
```

Even though all packages in `node_modules/@types` (of any enclosing folder) are included in your compilation. However, it's worth ensuring node is added under `compileOptions.types`:

```json
tsconfig.json

{
  compilerOptions: {
    types: [node, jest, express]
  }
}
```

**Missing entry file in package.json:** Each module has an entry file named `index.js`(by default) unless it's changed in the module's `package.json` via the `main` field.

```json
{
  name: utils
}
```

If you decide to change the `main` field to another entry file (e.g., `main.js`), you must ensure the file exists. Or if you rename or relocate that file in the future, remember to update the `package.json` too.

Missing entry file in `package.json` has been reported by several users on Stackoverflow.

**Importing a module from the global `node_modules` or a separate directory:** Sometimes you might have to use a globally-installed package in your development environment.

If you try to load a globally-installed module in your project, you might get the "Cannot find module" error.

A workaround to this problem is using the `npm link` command. If the package is installed globally, all you need to do is run the following command while in your project directory:


`npm link package-name`

As a result, npm will create a symbolic link from the globally installed package name to the `node_modules` directory of your project - as if you've installed it with `npm install package-name`.

If the module you want to use is a local file residing somewhere in your file system other than the global `node_modules` (e.g., a module you're developing), you'll have to do it in a two-step process:

**First step:** In the terminal, you need to change the directory to where the module resides and run the `npm link` (without any parameter). As a result, a symlink is created in the global node_modules that links to your local package.

```
npm link
```

**Second step:** After that, you change the directory to your project directory (where you want to import the module) and run the following command:

```
npm link package-name
```

This will create a symbolic link from the globally installed package name to the `node_modules` directory of your project.

Now, you can use the package as if it's an installed third-party package.

## What if the problem persists?

If none of the above solutions worked for you, maybe you're dealing with corrupted or incomplete installations. In that case, you can take the following steps:

Delete `node_module` directory:

```
rm -rf node_modules
```

Delete `package-lock.json`:

```
rm -f package-lock.json
```

Clear the npm cache:

```
npm cache clean --force
```

Install the packages again:

```
npm install
```

This will make a clean install of all the dependencies listed in your `package.json` file.

I hope these solutions help you fix your code.

Thanks for reading.

---

**❤️ You might like:**

- [TypeError: map is not a function in JavaScript in JavaScript (Fixed)](https://www.decodingweb.dev/fix-map-is-not-a-function-error-in-javascript)
- [Add commas to numbers in JavaScript (Explained with examples)](https://www.decodingweb.dev/add-commas-to-numbers-in-javascript)
- [SyntaxError: Unexpected end of JSON input in JavaScript (Fixed)](https://www.decodingweb.dev/syntaxerror-unexpected-end-of-json-input-in-javascript)
- [How to fix "ReferenceError: document is not defined" in JavaScript](https://www.decodingweb.dev/how-to-solve-referenceerror-document-is-not-defined)
- [Label htmlFor Property Explained](https://www.decodingweb.dev/label-htmlfor-property-explained)