La instalación global de NPM "no puede encontrar el módulo"

206

Escribí un módulo que publiqué en npm hace un momento (https://npmjs.org/package/wisp)

Entonces se instala bien desde la línea de comando:

$ npm i -g wisp

Sin embargo, cuando lo ejecuto desde la línea de comandos, sigo recibiendo un error de que optimist no está instalado:

$ wisp 
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)

Sin embargo, he especificado en package.json como una dependencia:

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

¿Alguien sabe qué hacer para que esto funcione? Sé que tiene que ver con la parte bin agregando el ejecutable a bin y los node_modules en ese directorio están vacíos. No tengo idea de cómo resolver esto.

Menztrual
fuente
¿Qué sucede si instala sin la opción -g?
vinayr
Instala una carpeta node_modules en el directorio actual que tiene un wisp dentro de eso.
Menztrual
Lo sé. ¿Todavía recibes un error?
vinayr
Sí. Si trato de ejecutar wisp después de hacer un npm local i wisp, aún devuelve el mismo error
Menztrual
Acabo de instalar su módulo. Esta trabajando bien para mi. ¿Dónde está tu brizna? En mi caso corrí, lo ./node_modules/wisp/wispque funciona bien.
vinayr

Respuestas:

370

Para cualquier otra persona que se encuentre con esto, tuve este problema debido a mi npminstalación en una ubicación que no está en mi NODE_PATH.

[root@uberneek ~]# which npm
/opt/bin/npm
[root@uberneek ~]# which node
/opt/bin/node
[root@uberneek ~]# echo $NODE_PATH

Mi NODE_PATH estaba vacío y la ejecución npm install --global --verbose promised-iomostró que se estaba instalando en /opt/lib/node_modules/promised-io:

[root@uberneek ~]# npm install --global --verbose promised-io
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]

Mi script falla en require('promised-io/promise'):

[neek@uberneek project]$ node buildscripts/stringsmerge.js 

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

Probablemente instalé node y npm desde la fuente usando configure --prefix=/opt. No tengo idea de por qué esto los ha hecho incapaces de encontrar los módulos instalados. La solución por ahora es apuntar NODE_PATH al directorio correcto:

export NODE_PATH=/opt/lib/node_modules

Mi require('promised-io/promise')ahora tiene éxito.

Neek
fuente
10
¿Dónde configurar este NODE_PATH?
arenoso
8
@sandy donde configura la variable de entorno NODE_PATH depende de su sistema operativo. Estoy usando una versión de Linux, así que solía export NODE_PATH=...configurarlo en el shell local para que se exportara a los comandos que se ejecutan en ese shell. Para que el cambio sea persistente o esté disponible para todos los shells, colóquelo en .profile o similar. El concepto en su conjunto es molestamente complejo para el novato, intente leer help.ubuntu.com/community/EnvironmentVariables . Para Windows, querrás cambiar a Linux. OK, solo bromeaba. Pruebe computerhope.com/issues/ch000549.htm o busque en google.
Neek
13
Para OSX Lion, lo siguiente funcionó para mí ... export NODE_PATH = / usr / local / lib / node_modules Utilicé 'localizar node_modules' para rastrear el camino correcto.
k1eran
2
NODE_PATH también funciona para WINDOWS. Esto se basa en módulos de nodo que se pueden instalar tanto local como globalmente.
Zinking
55
Si instaló Node.js con Homebrew en Mac OS X: Ejecute open -a TextEdit ~/.bash_profileen Terminal, luego agregue export NODE_PATH=/usr/local/lib/node_modulesal final del archivo. Reinicie la ventana de terminal. Ahora se echo $NODE_PATHdebe imprimir /usr/local/lib/node_modules.
Pwdr
39

agregue esto al comienzo del programa (mac):

module.paths.push('/usr/local/lib/node_modules');

Cando Zhou
fuente
44
¿Alguna forma de hacerlo de una manera no específica del sistema operativo?
UpTheCreek
@UpTheCreek esta es una forma no específica del sistema operativo . Es un código JS, solo necesita apuntar a un nodo_módulos que tiene el módulo que está buscando
Adelin
@Adelin: es una solución específica del sistema operativo porque la ubicación de los módulos_nodo globales es específica del sistema operativo. Por ejemplo, si está desarrollando en Windows y ejecuta Linux en producción, entonces esta no es una gran solución.
UpTheCreek
Eso se supera fácilmente. Por ejemplo, puede guardar la ruta del nodo en una variable env, por ejemplo, y reemplazar la ruta codificada con os.environ.nodepath(algo en esta línea).
Adelin
macOS Mojave 10.14.6 requiere agregar export NODE_PATH = / usr / local / lib / node_modules / npm / node_modules a ~ / bash_profile, que es más independiente de la máquina, ya que el código .js nativo no se ve afectado.
vwvan
16

Por defecto, el nodo no mira dentro del / usr / local / lib / node_module para cargar módulos globales. Consulte la carga del módulo explicada en http://nodejs.org/api/modules.html#modules_loading_from_the_global_folders

Por lo tanto, debe 1) agregar el / usr / local / lib / node_module a NODE_PATH y exportarlo o 2) copiar los módulos de nodo instalados en / usr / local / lib / node. (Como se explica en el enlace para cargar el nodo del módulo, buscará en esta ruta y funcionará)

aleatoriedad
fuente
10

Para algunos (como yo) que nada más funcionó, intente esto:

brew cleanup
brew link node
brew uninstall node
brew install node

Espero que ayude a alguien :)

Será
fuente
9

La siguiente solución genérica sería para cualquier módulo. Por ejemplo con request-promise.

Reemplazar

npm install request-promise --global

Con

npm install request-promise --cli

trabajado ( fuente ) y también para globalsyinherits

Además, intente configurar la variable de entorno

NODE_PATH=%AppData%\npm\node_modules
Mohammed Zameer
fuente
3

$ vim /etc/profile.d/nodejs.sh

NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
export NODE_PATH="$NODE_PATH"
usuario1959076
fuente
Eso está ahí por defecto. Para los usuarios está cargado, pero mientras se ejecuta como root no lo está, por lo tanto, debe incluirse en la ruta del usuario root.
stamster
2

Para Windows, ¿ Nodejs no puede encontrar el módulo instalado en Windows? lo que funcionó para mí está ejecutando enlace npm como en

npm link wisp
PM
fuente
Sin embargo, una advertencia: hice esto pero no pude usar mi código comprimido con AWS lambda. Tenía que tener el node_module creado localmente como en npm install wisp --save(sin la opción -g)
PM
2

Para usuarios de Mac, es mejor usar la instalación manual:

Para minimizar la posibilidad de errores de permisos, puede configurar npm para usar un directorio diferente. En este ejemplo, será un directorio oculto en su carpeta de inicio.

  1. Haga una copia de seguridad de su computadora antes de comenzar.

  2. Haga un directorio para instalaciones globales:

    mkdir ~ / .npm-global

  3. Configure npm para usar la nueva ruta del directorio:

    npm config set prefijo '~ / .npm-global'

  4. Abra o cree un archivo ~ / .profile y agregue esta línea:

    export PATH = ~ / .npm-global / bin: $ PATH

  5. De vuelta en la línea de comando, actualice las variables de su sistema:

    fuente ~ / .profile

  6. Prueba: descargue un paquete globalmente sin usar sudo.

    npm install -g jshint

En lugar de los pasos 2 a 4, puede usar la variable ENV correspondiente (por ejemplo, si no desea modificar ~ / .profile):

NPM_CONFIG_PREFIX=~/.npm-global

Referencia: https://docs.npmjs.com/getting-started/fixing-npm-permissions

Shivansh Rajpoot
fuente
1

Tenía el mismo problema en uno de los servidores de prueba que se ejecutan Ubuntubajo root. Entonces creado un nuevo usuario usando useradd -m myusery todo instalado ( nvm, node, paquetes) como myuser. Ahora está funcionando bien.

Dmitriy
fuente
1

En Windows, si acaba de realizar una instalación limpia y obtiene esto, debe eliminar su caché npm en \ AppData \ Roaming

Dmitry
fuente
1

En mi caso ambos nodey npmestábamos en el mismo camino ( /usr/bin). El NODE_PATHestaba vacío, por lo que la npmcoloca los módulos globales en /usr/lib/node_modulesdonde require(...)encontrará con éxito. La única excepción fue el npmmódulo, que vino con el paquete nodejs. Como estoy usando un sistema de 64 bits, se colocó en /usr/lib64/node_modules. Aquí no es donde se requieren (...) búsquedas en caso de vacío NODE_PATHy el nodo comenzó desde /usr/bin. Entonces tenía dos opciones:

  • enlace /usr/lib64/node_modules/npma/usr/lib/node_modules/npm
  • mover módulos de /usr/lib/node_modules/*a /usr/lib64/node_modules/y conjuntoNODE_PATH=/usr/lib64/node_modules

Ambos trabajaron. Estoy usando OpenSUSE 42.1 y el paquete nodejs del repositorio de actualizaciones. La versión es 4.4.5.

GT.
fuente
1

Hice esto de manera simple ...

  1. Desinstalar nodo del panel de control [Windows 7]
  2. Instalar nodo nuevamente
  3. Instalar el npm install --global --verbose protractor
    administrador de controladores web de actualización de transportador .

funciona bien para mi

Espero que esto te ayude....

santhosh v
fuente
1

Obtuve este error Error: Cannot find module 'number-is-nan'mientras que el módulo realmente existe. Se debió a una instalación de Node.js incorrecta / incompleta.

Para Windows, como lo sugieren otras respuestas, necesita una instalación limpia de Node :

  • Desinstalar Node.js
  • Eliminar las dos carpetas npmy npm_cacheenC:\Users\user\AppData\Roaming
  • Reinicie Windows e instale Node.js
  • Ejecutar npm inito ( npm init --yespara la configuración predeterminada )
  • Establezca la variable de entorno de Windows para NODE_PATH. Esta ruta es donde están instalados sus paquetes. Probablemente sea algo comoNODE_PATH = C:\Users\user\node_modules or C:\Users\user\AppData\Roaming\npm\node_modules
  • Inicie una nueva consola cmd y npmdebería funcionar bien

Nota :

Pruebe los últimos puntos antes de reinstalar Node.js, podría ahorrarle algo de tiempo y evitar reinstalar todos sus paquetes.

alain.janinm
fuente
1

Acabo de resolver este problema del axiosmódulo. Luego probé esto: ejecutar rm -rf node_modulesy yarn. Y funciona.

Finedy
fuente
0

Tuve el mismo error que el OP, pero pude ver a través de los registros sh: node: command not found.

Resulta que el programa / usr / bin / node (enlace simbólico) ya no está instalado con apt install nodejs. Una vez que el enlace simbólico /usr/bin/node' tonodejs ,npm instaló -g @ angular / cli` tuvo éxito.

La forma correcta de instalar esto en Debian es apt install nodejs-legacy.

Miguel
fuente
0

Tuve que agregar C: \ Users \ {Nombre de usuario} \ AppData \ Roaming \ npm a mis variables env y luego pude instalar cosas.

Rainhider
fuente