node.jsnpm

NPM global install "cannot find module"


I wrote a module which I published to npm a moment ago (https://npmjs.org/package/wisp)

So it installs fine from the command line:

npm i -g wisp

However, when I run it from the command line, I keep getting an error that optimist isn't installed:

wisp

Output:

Error: Cannot find module 'optimist'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:362:17)
    at require (module.js:378:17)
    at Object.<anonymous> (/usr/local/lib/node_modules/wisp/wisp:12:10)
    at Object.<anonymous> (/usr/local/lib/node_modules/wisp/wisp:96:4)
    at Module._compile (module.js:449:26)
    at Object.exports.run (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/coffee-script.js:68:25)
    at compileScript (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:135:29)
    at fs.stat.notSources.(anonymous function) (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:110:18)

However, I have specified it in package.json as a dependency:

{
  "name": "wisp",
  "author": "Brendan Scarvell <bscarvell@gmail.com>",
  "version": "0.1.0",
  "description": "Global nodejs file server",
  "dependencies": {
    "optimist": "~0.3.4"
  },
  "repository": "git://github.com/tehlulz/wisp",
  "bin": {
    "wisp" : "./wisp"
  }
}

What can I do to get this running? I know its to do with the bin part adding the executable to bin and the node_modules folder folder in that directory being empty.


Solution

  • For anyone else running into this, I had this problem due to my npm installing into a location that's not on my NODE_PATH (running as root).

    cd ~
    which npm
    

    Output:

    /opt/bin/npm
    

    And:

    which node
    

    Output:

    /opt/bin/node
    

    And:

    echo $NODE_PATH
    

    Output:

    <Empty>
    

    My NODE_PATH was empty, and running npm install --global --verbose promised-io showed that it was installing into /opt/lib/node_modules/promised-io:

    npm install --global --verbose promised-io
    

    Output:

    npm info it worked if it ends with ok
    npm verb cli [ '/opt/bin/node',
    npm verb cli   '/opt/bin/npm',
    npm verb cli   'install',
    npm verb cli   '--global',
    npm verb cli   '--verbose',
    npm verb cli   'promised-io' ]
    npm info using npm@1.1.45
    npm info using node@v0.8.4
    [cut]
    npm info build /opt/lib/node_modules/promised-io
    npm verb from cache /opt/lib/node_modules/promised-io/package.json
    npm verb linkStuff [ true, '/opt/lib/node_modules', true, '/opt/lib/node_modules' ]
    [cut]
    

    My script fails on require('promised-io/promise'):

    cd ~/project
    node buildscripts/stringsmerge.js
    

    Output:

    module.js:340
        throw err;
              ^
    Error: Cannot find module 'promised-io/promise'
        at Function.Module._resolveFilename (module.js:338:15)
    

    I probably installed node and npm from source using configure --prefix=/opt. I don't have any idea why this has made them incapable of finding installed modules. The fix for now is to point NODE_PATH at the right directory:

    export NODE_PATH=/opt/lib/node_modules
    

    My require('promised-io/promise') now succeeds.