8
votes

I'm starting to develop with node.j,I meet an issue regarding the using of the module 'formidable'.

I have this error:

Error: Cannot find module 'formidable'

Here is the module list installed using 'npm ls installed' :

├─┬ [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ └── [email protected] 
├── [email protected] 
├─┬ [email protected] 
│ ├── [email protected] 
│ └─┬ [email protected] 
│   ├── [email protected] 
│   ├── [email protected] 
│   └─┬ [email protected] 
│     ├── [email protected] 
│     ├── [email protected] 
│     └── [email protected] 
├─┬ [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├─┬ [email protected] 
│ │ └── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├─┬ [email protected] 
│ │ ├── [email protected] 
│ │ └── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ └── [email protected] 
└─┬ [email protected] 
  ├── [email protected] 
  ├── [email protected] 
  └─┬ [email protected] 
    ├─┬ [email protected] 
    │ └── [email protected] 
    ├── [email protected] 
    ├─┬ [email protected] 
    │ ├── [email protected] 
    │ └── [email protected] 
    └── [email protected] 

I add that it is the only module who generate this error.

Also, I don't really understand the way are encapsulated some module, it appears that npm is installing the module directly in the directory I'm using the module installation command, and I notice that formidable has been installed in the express/connect/ module on its first installation.

Can you give me more information about the module installation tree.
Thank for your replies

Cheers

2
Don't panic! Stay calm, think where did you lastly see the formidable Node.js... :) - gdoron is supporting Monica
Can we please see the code where you try to require formidable? Otherwise how can we do anything at all to help you... - Hubro
I'm calling the require of the modules directly at the beginning of my file.js, I'm using this call : var formidable = require("formidable"); - bengo
The problem seems to be coming from the NODE_PATH environment var. If I call the complete path unto the node modules, then it works. where am i supposed to set this var, because it sounds like my bash_profile doesn't work for NODE_PATH. - bengo
My mistake, it's about my env PATH. Thank you for your contribution. - bengo

2 Answers

6
votes

The accepted answer looks very comprehensive and correct, but this worked for me:

npm install -d

d stands for dependencies (I think)

3
votes

To understand module resolution, have a look at the Modules documentation, especially Loading from node_modules Folders.

For example, if the file at '/home/ry/projects/foo.js' called require('bar.js'), then node would look in the following locations, in this order:

  • /home/ry/projects/node_modules/bar.js
  • /home/ry/node_modules/bar.js
  • /home/node_modules/bar.js
  • /node_modules/bar.js

NPM takes advantage of this by installing modules into:

./node_modules/{module}

So, when you use npm install formidable, it will create and install the module into:

./node_modules/formidable

But, this means that only scripts within the current directory, including sub-directories, will succeed in using require('formidable'):

./foo.js
./lib/bar.js
./src/baz.js
./src/sub/qux.js

You can however install modules as "global," but you have to explicitly ask for it with -g or --global:

npm install -g formidable

Then, any script on the system should be able to require('formidable').


As for the tree output, you current have 5 installed modules available from the current directory:

  • express
  • formidable
  • node-inspector
  • npm
  • socket.io

Everything else in the tree is a list of these modules' dependencies, and their dependencies, etc., but only these 5 are available for require(...) within your scripts.