mzedeler
mzedeler

Reputation: 4369

node.js require doesn't work in script?

I have a small node script named /tmp/test.js containing this:

console.log(require("w3cjs"));

If I do this from the command prompt:

nvm use v0.10.21
node /tmp/test.js

I get this output:

module.js:340
    throw err;
      ^
Error: Cannot find module 'w3cjs'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (/tmp/test.js:1:75)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)

But if I do this:

node -e $(cat /tmp/test.js)

I get this output:

{ validate: [Function: validate],
  setW3cCheckUrl: [Function: setW3cCheckUrl],
  w3cjs: [Circular] }

(In other words - it works.)

Why the difference and how do I make the script work?

Upvotes: 3

Views: 8295

Answers (1)

apsillers
apsillers

Reputation: 115950

When you run a script in a different directory, Node looks for local modules in the node_modules folder of that script's directory.

Suppose your shell's working directory is currently /projects/foo. When you run node /tmp/test.js, Node looks for modules in /tmp/node_modules, not in /projects/foo/node_modules.

However, if you don't run a script file, but run some text on the command line with -e, Node will check for a local module folder in your shell's current working directory, i.e., /projects/foo/node_modules.

It appears that you have w3cjs installed in your working directory, but not at /tmp. You should either install it there, or install the module globally with npm's -g option.

Upvotes: 9

Related Questions