How do I resolve "Cannot find module" error using Node.js?
Asked Answered
N

33

851

After pulling down a module from GitHub and following the instructions to build it, I try pulling it into an existing project using:

> npm install ../faye

This appears to do the trick:

> npm list
/home/dave/src/server
└─┬ [email protected]
  ├── [email protected]
  ├── [email protected]
  └── [email protected]

But Node.js can't find the module:

> node app.js
node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: Cannot find module 'faye'
    at Function._resolveFilename (module.js:334:11)
    at Function._load (module.js:279:25)
    at Module.require (module.js:357:17)
    at require (module.js:368:17)
    at Object.<anonymous> (/home/dave/src/server/app.js:2:12)
    at Module._compile (module.js:432:26)
    at Object..js (module.js:450:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Array.0 (module.js:470:10)

I really want to understand what is going on here, but I'm at a bit of a loss as to where to look next. Any suggestions?

Navigation answered 26/1, 2012 at 18:57 Comment(8)
The node_modules directory is expected to be in the root of your project, alongisde app.js in your case. Why did you use .. the npm install path?Inhumanity
My intent was to have two directories - one for the faye sources from github and another one for my project that requires faye. By installing from the faye directory (../faye), I expected it would install the module locally under node_modules, which appears to be what happened. I don't want to install globally since there are other projects that depend on a stable version of faye.Navigation
After changing "npm install ../faye" to "npm install ../faye/build", it works as expected. I don't know how typical this is, but faye creates a build directory when it is built and puts a copy of package.json in there. npm doesn't complain about package.json at the root level, but it references files that don't exist at that level.Navigation
I solved the problem, but didn't really get any resolution to my real question, which was how to troubleshoot this issue. I'll try to come up with some suggestions for improving npm and/or node to make it easier for newcomers to avoid this situation.Navigation
Go through this Link, you may get some idea like where exactly its failing to lookup your modules..Gulfweed
possible duplicate of How do I import global modules in Node? I get "Error: Cannot find module <module>"?Kalmar
Check weather you are in the same folder where you installed it ? if you did not installed it globally .Enchase
Here is what I was doing incorrectly & spent my Friday afternoon, const wpt = require("src/wpt"); which should have been const wpt = require("./src/wpt");. Path to the module or main JavaScript file was wrong. HTH someone.Philina
E
673

Using npm install installs the module into the current directory only (in a subdirectory called node_modules). Is app.js located under home/dave/src/server/? If not and you want to use the module from any directory, you need to install it globally using npm install -g.

I usually install most packages locally so that they get checked in along with my project code.

Update (8/2019):

Nowadays you can use package-lock.json file, which is automatically generated when npm modifies your node_modules directory. Therefore you can leave out checking in packages, because the package-lock.json tracks the exact versions of your node_modules, you're currently using. To install packages from package-lock.json instead of package.json use the command npm ci.

Update (3/2016):

I've received a lot of flak for my response, specifically that I check in the packages that my code depends on. A few days ago, somebody unpublished all of their packages (https://kodfabrik.com/journal/i-ve-just-liberated-my-modules) (archived on Wayback Machine) which broke React, Babel, and just about everything else. Hopefully it's clear now that if you have production code, you can't rely on NPM actually maintaining your dependencies for you.

Eeg answered 26/1, 2012 at 19:15 Comment(20)
"I usually install most packages locally so that they get checked in along with my project code." It's usually better to make a package.json listing what npm modules you depend on and ignore the node_modules folder. Then simply npm install to get setup after you clone the repo.Inhumanity
In addition to package.json listing the dependencies, I like to keep known good copies of things that I depend on. Disk space is cheap and if npm or the package disappears from npm, I'll still have a fully working project in my repo.Eeg
Thanks for the replies. All I'm trying to do is try out a development version of the module from github without installing it globally. Both app.js and node_modules are under /home/dave/src/server. I'll try the package.json approach, but I was hoping to figure out what exactly I am doing wrong above so other people don't repeat my mistake.Navigation
Using package.json won't change anything. If they are in the same directory and it's still not resolving then we'll need to see the code. Either the way you are importing it is incorrect or the way the module is exporting is incorrect.Eeg
I figured out what I was doing wrong. After changing "npm install ../faye" to "npm install ../faye/build", it works as expected. I don't know how typical this is, but faye creates a build directory when it is built and puts a copy of package.json in there. npm doesn't complain about package.json at the root level, but it references files that don't exist at that level.Navigation
As an old developer I nearly choked when I read the Node devs "paradigm" that "disk space is cheap". I have libraries that I am using. The idea that I might have 100 copies (or worse, NEAR copies) makes my stomach turn. Disk space is cheap, but maintenance time is expensive. Perhaps if you are doing a one-off toy project, maintenance is cheap. For real work, however, maintenance is expensive and has no bearing on the cost of disk space.Jeraldjeraldine
I really don't understand this last comment. Nobody is saying to have 100 copies of any piece of code, just to have 1 copy of the code that your project depends on. The alternative is to have a non-functional project if NPM or the dependency disappears one day. I would think re-writing a dependency from scratch is also pretty expensive. As an aside, I worked at Microsoft for 10 years and we always had 3rd party dependencies checked into our source tree.Eeg
@LloydSargent Having "NEAR copies" isn't worse, it's better, because each project has a specific dependency, that you've defined, and the rest of your code relies on. If you had the same versions across multiple projects then if you update anything you must update everything. Pinning dependencies allows piecemeal upgrades-substantially less maintenance. Real work, non-toy projects.Chevron
@DaveNewton Yes. This is what the Node developers are saying: disk space is cheap, therefore copy the code library across multiple projects. They totally skip the part that if the library is updated those multiple copies must be updated. That was the point of my post.Jeraldjeraldine
npm is primarily a dev tool. If the project is working, there is no reason to update the libraries upon which it depends. If you're doing long-term maintenance of production environments, npm is not the tool to use. apt might be better for that.Armageddon
@Bill- node allows for a rather inefficient way of organizing modules, which npm abuses to regularly create extremely deep and redundant nesting of modules dependencies. For any module, that module's dependencies may exist either at the same level as the module, or in a directory in the module, typically called node_modules. So, if you have 5 modules listed in your package.json and each depends on (or has a dependency which depends on) any other particular package, npm's default behaviour is to install a copy of the dependency under each of the module's node_modules directory.Foreleg
@bschlueter I find using the --production flag cuts out most of the redundancy (most of the deep nestings are for the dev tools that surround a project). But in any case, this is the system that npm uses so the options are still to check it all in so you can always rebuild, or hope the versions that you need remain forever available on npm.Eeg
@Eeg My problem isn't with the fact that all the modules get stored, it's that they may be stored multiple times. It seems to me that each version of each module could all be stored at the same level in one directory, which would make the deep paths unnecessary. Ruby and Python both do this, and it produces a much cleaner module directory.Foreleg
@bschlueter Totally agree that it's not the best system and could have been designed to be more efficient, but it's what we're currently stuck with.Eeg
npm shrinkwrap I believe it is will make sure that, if node modules are ignored in version control(git), the version of all dependencies in the project stay consistent and it will always use the version that was used originally, and is working, in the project when running npm install on another machine to work on the project.Jackpot
I don't see why you should check in the installed packages? I would suggest that you only check in the actual file that states which packages to install.Cynical
Because of this: medium.com/@azerbike/…. Somebody went and unpublished all of their modules. My builds were all fine, how did everyone else fair?Eeg
@Bill, I couldn't agree more with your policy. The popularity of some of the counter-responses is very troubling. My idea of revision control doesn't involve making assumptions about the future actions of unknown third parties.Navigation
Maybe a bit late to the party but, Bill is right. It is just tedious. A middle ground approach is to develop, based on NPM (meaning, not committing the libraries) for development and having developers use NPM. Then for production, moving "release" packages, meaning, including all the dependencies. Releasing via GIT and expecting NPM to manage dependencies is not a good practice.Vitrescence
Ironically, the link to the kodfabrik is broken :DPaymar
B
600

I had a very similar issue. Removing the entire node_modules folder and re-installing worked for me:

rm -rf node_modules
npm install
Botryoidal answered 25/5, 2015 at 10:30 Comment(6)
I would also do a npm cache clean, just as a safety thing :)Cislunar
Probably a good first troubleshooting step whenever a weird dependency issue pops up that npm install/npm update won't solve. This solved an issue where Error: Cannot find module 'http-errors' randomly started showing when I tried to run my Express app.Gay
Amazing, @carelesslyChoosy's answer resolved a missing dependency. It seems upgrading and downgrading with npm install in place does not keep things tidy.Assignment
A missing step here is to remove your package-lock.json file before running npm install.Illumination
npm ci will do the same thing but is x-platformAccepted
Regarding the comment to remove package-lock, dont do this. You should pretty much never have to delete or edit this file, it can cause problemsHorntail
R
106
npm install --save module_name

For example, if the error is:

{ [Error: Cannot find module '/root/.npm/form-data'] code: 'MODULE_NOT_FOUND' }

then you can resolve this issue by executing the command npm install --save form-data.

Realist answered 17/6, 2015 at 8:51 Comment(2)
it seems like when i installed it globally the npm/node-modules folder was empty and i was trying to use ng new project-name it was showing some modules missing ... I had to install them each using the given command.Then it solved the issue but is there any single command to install all of the them at once ?Augie
@VishalNair you can just run npm install if all dependencies are listed in a package.json file. They are added automatically on npm install <package-name>, the --save is no longer neededAntisana
P
47
rm package-lock.json
rm -r node_modules
npm i

That should fix issue and install all packages.

Pandiculation answered 26/3, 2021 at 11:53 Comment(0)
C
42

For TypeScript users, if you are importing a built-in Node module (such as http, path or url) and you are getting an error such as "Cannot find module "x" then the error can be fixed by running

npm install @types/node --save-dev

The command will import the NodeJS TypeScript definitions into your project, allowing you to use Node's built-in modules.

Carlin answered 3/10, 2017 at 9:12 Comment(0)
R
23

This happens when a first npm install has crashed for some reason (SIGINT of npm), or that the delay was too long, or data is corrupted. Trying an npm install again won't save the problem.

Something got wrong on the npm first check, so the best choice is to remove the file and to restart npm install.

Rodi answered 6/8, 2015 at 16:23 Comment(1)
this diagnosed the problem for me. i ended up doing npm cache clear and clearing out node_modules followed by npm install to fix my issue.Outguard
M
18

I experienced this error yesterday. Took me a while to realise that the main entry in package.json was pointing to a file that I'd moved. Once I updated that the error disappeared and the package worked.

Minim answered 25/8, 2016 at 8:37 Comment(4)
Holy cow...out of desperation I typed in "Error: Cannot find module" into google, and found this question. Your answer fixed my problem. I can't believe such a vague search term turned up the right answer. Kudos to you and to Google!Kendallkendell
Very much this. I had managed to point the main entry for my submodule in a directory that was excluded from its repository so when I tried to include it via npm install it worked, but no exports were found when required in! Many thanks for this obvious but useful answer.Nineteenth
Thanks for this. I had this situation whilst using Yarn workspaces, so was looking all over for path resolution algorithms and all sorts. :) I was thrown by the way the error message talks of 'locating' the module, and also that ESLint was giving similar error messages. And then I saw your answer and realised I was a dimwit. Thanks!Catarina
Where is the package.json file? Can someone provide more context? I've been using VS Code for a year and have successfully written all kinds of coding projects, but I'm new to NodeJS, and need a step by step on how to fix this very frustrating issue. Everything else I've tried right on this page does not work, or there just isn't enough context.Winshell
N
17

Check if the enviroment variable NODE_PATH is set correctly and pointing to the node_modules path. nodejs uses this variable to search for the libraries

Nolanolan answered 6/2, 2018 at 3:34 Comment(2)
I upvoted this as it solved my immediate problem, and led me to this node.js documentation. But I think this is not a blanket answer, as the documentation indicates alternative strategies for locating modules.Taddeusz
Yeah this should be the right way to solve such not found module path-related issuesSims
N
13

If you use nvm, check that existing node_modules that are bindings to other libraries are compiled for the correct Node.js version.

I was having the same error. The reason was the following: We use nvm since we're running two apps on a server, one requires Node.js 5.6 because it uses node-gd (which doesn't run on Node.js 6 for now), the other requires Node.js 6. Node.js 6 is the apt-get installation.

Also we use the pm2 tool to deploy.

So, the default setup is that the pm2 process starts when nvm is not in effect, so it uses the apt-get installation of Node.js (version 6). So the main pm2 daemon starts with Node.js 6. If I run applications in fork mode they start in separate processes and nvm settings are in effect. When I run applications in cluster mode - they inherit the non-nvm environment.

So when I tried to switch to the cluster mode the application failed to start because the bindings compiled for 5.6 fail with this message.

I've fixed that by restarting pm2 when nvm setings are in effect. Also startup scripts should be fixed.

Nichy answered 10/6, 2016 at 11:30 Comment(0)
P
11

If all other methods are not working for you... Try

npm link package_name

e.g

npm link webpack
npm link autoprefixer

e.t.c

Pokey answered 10/8, 2020 at 17:7 Comment(2)
An explanation would be appreciated!Matutinal
Explain, someone!Refuse
S
10

This error can be encountered if you are requireing a module that has a missing or incorrect main field in its package.json. Though the module itself is installed, npm/node has to use a single .js file as an entrypoint to your module. If the main field is not there, it defaults to looking for index.js in your module's folder. If your module's main file is not called index.js, it won't be able to require it.

Discovered while turning a browserify-based module into a CommonJS require-able module; browserify didn't care about the missing main field, and so the error had gone unnoticed.

Sartorius answered 23/6, 2017 at 14:30 Comment(0)
S
5
  • Run the following commands, step by step:

  • npm cache clean -force

  • rm package-lock.json

  • rm -r node_modules

  • npm i --save --legacy-peer-deps

Spiky answered 21/9, 2022 at 10:9 Comment(0)
B
4

Remove your node_module root folder from your project(eg: myApp). Go to myApp folder and then type below command from terminal

>myApp>npm install

It will install all the dependency modules required for your project.

Bony answered 6/7, 2016 at 7:25 Comment(1)
Could you please elaborate more your answer adding a little more description about the solution you provide?Gryphon
O
4

PRO TIP:

This error happened to me, while fighting fatigue and mild illness, because I typed node blah instead of npm blah.

The error message received wasn't angry enough to alert me to my own folly!

Orelu answered 6/9, 2016 at 9:35 Comment(0)
R
4

Just found an unusual scenario that may be of use to someone and is sort of a red herring.

I was also getting the Cannot Find Module error but oddly everything worked perfectly in my local (Mac hosted) Node.js environment. This problem only appeared when the code was deployed on our Linux server.

Well... it turned out to be a typo that (apparently) the Mac based Node.js installation was perfectly happy to ignore.

The include looked like this:

var S3Uploader = require('./S3Uploader.class');

But the actual file was called "s3Uploader.class.js"

Notice the casing difference in the 's' vs. 'S' between the code and the filename.

So - in the odd chance that none of the other solutions here are solving your problem, triple check that you're not mis-casing the characters in your included filename! :)

and DUH!

Rabblerouser answered 18/5, 2017 at 20:17 Comment(1)
By default osx filesystem (HFS+) is case insensitive ... discovered not long ago, it's definitely configurable thoughTedmann
P
4

I can add one more place to check; the package that I was trying to use was another one of my own packages that I had published to a private NPM repo. I had forgotten to configure the 'main' property in the package.json properly. So, the package was there in the node_modules folder of the consuming package, but I was getting "cannot find module". Took me a few minutes to realise my blunder. :-(

Padnag answered 10/7, 2017 at 5:57 Comment(0)
B
4

Specify the path to the restler folder, which will be inside node_modules folder like : var rest = require('./node_modules/restler');

This worked for me.

Blackandwhite answered 6/9, 2017 at 5:20 Comment(0)
D
3

If you are using typescript and getting an error after installing all node modules then remove package-lock.json. And then run npm install.

Distillery answered 20/12, 2019 at 6:22 Comment(0)
V
2

In my case I had UNMET PEER DEPENDENCY redux@^3.0.0 causing this error message, see all of them and install missing modules again using --save

npm install redux --save
Valaria answered 18/10, 2017 at 11:50 Comment(0)
R
1

I had this issue using live-server (using the Fullstack React book):

I kept getting:

Error: Cannot find module './disable-browser-cache.js' 
...

I had to tweak my package.json

  • From:

    "scripts": { ... "server": "live-server public --host=localhost --port=3000 --middleware=./disable-browser-cache.js" ... } "scripts": {

  • To:

    ... "server": "live-server public --host=localhost --port=3000 --middleware=../../disable-browser-cache.js" ... }

Notice relative paths seem broken/awkward... ./ becomes ../../

I found the issue here

Also if anyone follows along with that book:

  1. change devDependencies in packages.json to:

"live-server": "https://github.com/tapio/live-server/tarball/master"

Currently that upgrades from v1.2.0 to v1.2.1

  1. It's good to use nvm.
  2. It's best to install v13.14 of Node (*v14+ creates other headaches) nvm install v13.14.0
  3. nvm alias default v13.14.0
  4. Update npm with npm i -g [email protected]
  5. run: npm update
  6. you can use npm list to see the hierarchy of dependencies too. (For some reason node 15 + latest npm defaults to only showing first level of depth - a la package.json. That renders default command pointless! You can append --depth=n) to make command more useful again).
  7. you can use npm audit too. There issues requiring (update of chokidar and some others packages) to newer versions. live-server hasn't been updated to support the newer corresponding node v 14 library versions.

See similar post here


Footnote: Another thing when you get to the JSX section, check out my answer here: https://mcmap.net/q/54950/-classnames-is-not-defined

When you get to:

  • Advanced Component Configuration with props, state, and children. P182+, node version 13 isn't supported for some of the dependencies there.
  • Will add findings for that later too.
Rubicon answered 21/12, 2020 at 20:42 Comment(0)
U
1

In my case,

npm install -D tslib @types/node

solved my problem, I was then able to run

ts-node index.ts

successfully.

Unmeriting answered 7/7, 2021 at 15:58 Comment(0)
M
0

I was trying to publish my own package and then include it in another project. I had that issue because of how I've built the first module. Im using ES2015 export to create the module, e.g lets say the module looks like that:

export default function(who = 'world'){
    return `Hello ${who}`;
}

After compiled with Babel and before been published:

'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});

exports.default = function () {
    var who = arguments.length <= 0 || arguments[0] === undefined ? 'world' : arguments[0];


    return 'Hello ' + who;
};

So after npm install module-name in another project (none ES2015) i had to do

var hello = require('module-name').default;

To actually got the package imported.

Hope that helps!

Morehead answered 6/4, 2016 at 7:53 Comment(0)
S
0

Encountered this problem while using webpack with webpack-dev-middleware.

Had turned a single file into a folder.

The watcher seemed to not see the new folder and the module was now missing.

Fixed by restarting the process.

Stolen answered 19/4, 2017 at 0:22 Comment(0)
E
0

Maybe like me you set 'view engine' in express to an engine that doesn't exist, or tried to use an unregistered templating engine. Make sure that you use: app.engine('engine name',engine) app.set('view engine','engine name')

Esquivel answered 3/2, 2018 at 17:14 Comment(0)
S
0

Removing node/npm and then re-installing the stable(not the latest) version worked for me.

sudo rm -rf /usr/local/{lib/node{,/.npm,_modules},bin,share/man}/{npm*,node*,man1/node*}

https://nodejs.org/en/download/
Stokes answered 12/4, 2019 at 15:50 Comment(0)
F
0

In my case, i was not using the proper version of nvm.

Flatulent answered 28/7, 2021 at 5:51 Comment(0)
S
0

A rare but also possible case is a typo in the module name. I missed the "s" in the file name when executing node .\util.js, where it should be node.\utils.js and didn't find any solution among all the answers under this question until I found out that I can't run the file even if I delete everything!

Solidify answered 4/9, 2021 at 12:31 Comment(0)
M
0

Apparently, judging by this question, there are a LOT of possible causes.

Maybe this will help someone, hoping nobody was as stupid as I was to use this technique:

Check if you have any node_modules folder up the folder tree.

Scenario 1: If you ever had a projects folder, where you shared a node_modules folder between multiple projects, you may not have had any problems

|- projects
| |- node_modules     <- OK
| |- project1         <- No node_modules folder
| | |- package.json
| |- project2         <- No node_modules folder
| | |- package.json

Scenario 2: If you add a third project of a different nature, you may choose to keep a node_modules folder in that project:

|- projects
| |- node_modules     <- Can be used by project 3
| |- project1         <- No node_modules folder
| | |- package.json
| |- project2         <- No node_modules folder
| | |- package.json
| |- project3
| | |- node_modules   <- Packages for project 3 only
| | |- package.json

I'm guessing some packages in project 3's node-modules folder are relying on packages that it finds (or doesn't find) in the parent folder's node_modules folder. Even though you'd expect the dependencies to be found in project 3's node_modules folder. Maybe it's because of the way some packages are imported and referenced?

Goes without saying that's a disaster waiting to happen :)

Mccrory answered 16/2, 2022 at 19:14 Comment(0)
S
0

I ran into this issue when I was upgrading the node version along with installing several different package versions. The project created a docker image/container to work in.

The issue was that the Docker image wasn't recreated when I added a package and rebuilt the project. The proper information had been in my local package.json and package-lock.json files.

Deleting the Docker image and not just the container solved my problem.

Sekyere answered 29/4, 2022 at 14:11 Comment(0)
R
0

what ended up working for me was making sure to include any merge-deep dependencies as an external in your webpack config:

externals: {
    puppeteer: 'require("puppeteer")',
}

And to declare the node_modules path relative to your package.json in your package.json as an 'extraResource'.

"extraResources": [
    "node_modules/puppeteer,
}
Representationalism answered 13/12, 2022 at 14:37 Comment(0)
K
-1

Please install the new CLI v3 (npm install -g ionic@latest).

If this issue is still a problem in CLI v3. Thank you!

Kohlrabi answered 3/10, 2018 at 8:50 Comment(0)
I
-3

First of all, yes, a part of my answer definitely is helpful to solve the error that is posted by OP. Secondly, after trying the below step, I faced a couple of other errors, and so, have written the solution of those too.

(Psst! I am not sure if I've successfully helped in solving the above error, or if I've broken some rule or format of answering, but I faced the above error and some others and it took much time for me to find the proper solutions for those errors. I'm writing the complete solution because in case, if someone else also faces these errors, then he'll hopefully get a solution here.)

So adding to, and elaborating the answer provided by PrashanthiDevi, and also adding my personal experience, here it is:

I am new to the whole e2e and unit tests part. I started looking into this part from Protractor. Now I already had the files in which tests were written, but I had to run the tests.

I had already installed all the required softwares and tools, but when I initially ran the code for running the tests, gulp itest, I got this 'Cannot find module' Error. After going through many different questions on SO, I found one answer that I thought could help getting a solution.

The person had suggested to run the command npm install in my project folder.

The reason for doing this was to update the node-modules folder, inside our project folder, with all the required and necessary files and dependencies.

(The below part maybe irrelevant with this question, but might be helpful if anyone came across the same situation that I faced.)

The above step surely solved my previous error, but threw a new one! This time the error being Could not find chromedriver at '..\node_modules\protractor\selenium\chromedriver'.

However, the solution of this error was pretty silly (and funny) to me. I already had the chromedriver file in my selenium folder. But, turns out that the above error was coming because my chromedriver files were inside selenium folder and not inside chromedriver folder. So, creating a chromedriver folder and copying the chromedriver files there solved my problem!

Also, for the error: Timed out waiting for the WebDriver Server, you could add this line of code to conf.js file inside exports.config{}:

seleniumAddress: 'http://localhost:8080/'

Hope this helps!

Inartificial answered 23/9, 2016 at 11:28 Comment(0)
S
-36

Change the directory and point to your current project folder and then "npm install". .

This will install all dependencies and modules into your project folder.

Selfcontrol answered 26/1, 2012 at 18:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.