L'installation globale de NPM «ne trouve pas de module»


206

J'ai écrit un module que j'ai publié il y a un instant sur npm (https://npmjs.org/package/wisp)

Il s'installe donc très bien à partir de la ligne de commande:

$ npm i -g wisp

Cependant, lorsque je l'exécute à partir de la ligne de commande, je reçois toujours une erreur indiquant qu'optimist n'est pas installé:

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

Cependant, j'ai spécifié dans package.json comme dépendance:

{
  "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"
  }
}

Quelqu'un sait-il quoi faire pour que cela fonctionne? Je sais que cela a à voir avec la partie bin ajoutant l'exécutable à bin et les node_modules dans ce répertoire étant vides. Je ne sais pas comment résoudre ce problème.


que se passe-t-il si vous installez sans l'option -g?
vinayr

Il installe un dossier node_modules dans le répertoire courant qui contient wisp à l'intérieur.
Menztrual

Je connais. Avez-vous toujours une erreur?
vinayr

Oui. Si j'essaye d'exécuter wisp après avoir fait un nisp local, je retourne toujours la même erreur
Menztrual

Je viens d'installer votre module. Ça marche bien pour moi. Où est ton feu follet? Dans mon cas, j'ai couru ./node_modules/wisp/wispce qui fonctionne bien.
vinayr

Réponses:


370

Pour toute autre personne rencontrant cela, j'ai eu ce problème en raison de mon npminstallation dans un emplacement qui n'est pas sur moi NODE_PATH.

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

Mon NODE_PATH était vide et son fonctionnement npm install --global --verbose promised-iomontrait qu'il s'installait dans /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]

Mon script échoue 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)

J'ai probablement installé le noeud et le npm à partir de la source en utilisant configure --prefix=/opt. Je ne sais pas pourquoi cela les a rendus incapables de trouver les modules installés. Le correctif pour l'instant consiste à pointer NODE_PATH vers le bon répertoire:

export NODE_PATH=/opt/lib/node_modules

Mon require('promised-io/promise')réussit maintenant.


10
où placer ce NODE_PATH ??
sable

8
@sandy où vous définissez la variable d'environnement NODE_PATH dépend de votre système d'exploitation. J'utilise une saveur de Linux, donc je l'ai utilisé export NODE_PATH=...pour le définir dans le shell local de sorte qu'il soit exporté vers des commandes exécutées dans ce shell. Pour rendre la modification persistante ou disponible pour tous les shells, mettez-la dans .profile ou similaire. Le concept dans son ensemble est ennuyeusement complexe pour le débutant, essayez de lire help.ubuntu.com/community/EnvironmentVariables . Pour Windows, vous voudrez passer à Linux. OK, je plaisante. Essayez computerhope.com/issues/ch000549.htm ou google it.
Neek

13
Pour OSX Lion, ce qui suit a fonctionné pour moi ... export NODE_PATH = / usr / local / lib / node_modules J'ai utilisé 'Locate node_modules' pour trouver le bon chemin.
k1eran

2
NODE_PATH fonctionne également pour WINDOWS. ceci est enraciné dans des modules de nœuds qui peuvent être installés localement et globalement.
zinking

5
Si vous avez installé Node.js avec Homebrew sur Mac OS X: Exécuter open -a TextEdit ~/.bash_profiledans le terminal, puis ajoutez export NODE_PATH=/usr/local/lib/node_modulesà la fin du fichier. Redémarrez la fenêtre du terminal. La course echo $NODE_PATHdevrait maintenant s'imprimer /usr/local/lib/node_modules.
Pwdr

39

ajoutez ceci au début du prog (mac):

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


4
Y a-t-il un moyen de le faire d'une manière non spécifique au système d'exploitation?
UpTheCreek

@UpTheCreek c'est une manière non spécifique au système d' exploitation . C'est du code JS, il vous suffit de pointer vers un node_modules qui a le module que vous recherchez
Adelin

@Adelin - C'est une solution spécifique au système d'exploitation, car l'emplacement des modules nodaux globaux est spécifique au système d'exploitation. Par exemple, si vous développez sur Windows et exécutez Linux en production, ce n'est pas une excellente solution.
UpTheCreek

C'est facilement surmonté. Par exemple, vous pouvez enregistrer le chemin du nœud dans une variable env, par exemple, et remplacer le chemin codé en dur par os.environ.nodepath(quelque chose dans ce sens).
Adelin

macOS Mojave 10.14.6 nécessite d'ajouter l'export NODE_PATH = / usr / local / lib / node_modules / npm / node_modules à ~ / bash_profile qui est plus indépendant de la machine dans la mesure où le code natif .js n'est pas affecté.
vwvan

16

Par défaut, le nœud ne regarde pas à l'intérieur du / usr / local / lib / node_module pour charger les modules globaux. Reportez-vous au chargement du module expliqué dans http://nodejs.org/api/modules.html#modules_loading_from_the_global_folders

Donc, soit vous devez 1) ajouter le / usr / local / lib / node_module à NODE_PATH et l'exporter ou 2) copier les modules de nœud installés dans / usr / local / lib / node. (Comme expliqué dans le lien pour le chargement du module, le nœud cherchera dans ce chemin et fonctionnera)


10

Pour certains (comme moi) que rien d'autre n'a fonctionné, essayez ceci:

brew cleanup
brew link node
brew uninstall node
brew install node

J'espère que cela aide quelqu'un :)


9

Le correctif générique suivant s'appliquerait à n'importe quel module. Par exemple avec request-promise.

Remplacer

npm install request-promise --global

Avec

npm install request-promise --cli

travaillé ( source ) et aussi pour globalsetinherits

Essayez également de définir la variable d'environnement

NODE_PATH=%AppData%\npm\node_modules


3

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

NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
export NODE_PATH="$NODE_PATH"

C'est là par défaut. Pour les utilisateurs, il est chargé, mais lorsqu'il est exécuté en tant que root, il ne l'est pas, il doit donc être inclus dans le chemin de l'utilisateur root.
stamster

2

Pour Windows, Nodejs ne trouve pas le module installé sur Windows? ce qui a fonctionné pour moi est d'exécuter le lien npm comme dans

npm link wisp

Un mot d'avertissement cependant - je l'ai fait mais je n'ai pas pu utiliser mon code zippé avec AWS lambda. Je devais avoir le node_module créé localement comme dans npm install wisp --save(sans l'option -g)
PM

2

Pour les utilisateurs de Mac, il est préférable d'utiliser l'installation manuelle:

Pour minimiser le risque d'erreurs d'autorisation, vous pouvez configurer npm pour utiliser un répertoire différent. Dans cet exemple, ce sera un répertoire caché sur votre dossier personnel.

  1. Sauvegardez votre ordinateur avant de commencer.

  2. Créez un répertoire pour les installations globales:

    mkdir ~ / .npm-global

  3. Configurez npm pour utiliser le nouveau chemin de répertoire:

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

  4. Ouvrez ou créez un fichier ~ / .profile et ajoutez cette ligne:

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

  5. De retour sur la ligne de commande, mettez à jour vos variables système:

    source ~ / .profile

  6. Test: téléchargez un package globalement sans utiliser sudo.

    npm install -g jshint

Au lieu des étapes 2 à 4, vous pouvez utiliser la variable ENV correspondante (par exemple, si vous ne souhaitez pas modifier ~ / .profile):

NPM_CONFIG_PREFIX=~/.npm-global

Référence: https://docs.npmjs.com/getting-started/fixing-npm-permissions


1

Eu le même problème sur l'un des serveurs de test Ubuntusous root. Ensuite , créé un nouvel utilisateur à l' aide useradd -m myuseret tout installé ( nvm, node, forfaits) comme myuser. Maintenant ça marche bien.


1

Sur Windows, si vous venez de faire une installation propre et que vous obtenez cela, vous devez supprimer votre cache npm dans \ AppData \ Roaming


1

Dans mon cas, les deux nodeet npmétaient sur le même chemin ( /usr/bin). Le NODE_PATHétait vide, donc les npmmodules globaux étaient placés /usr/lib/node_moduleslà où require(...)les trouver avec succès. La seule exception était le npmmodule, fourni avec le package nodejs. Puisque j'utilise un système 64 bits, il a été placé dans /usr/lib64/node_modules. Ce n'est pas là que nécessitent (...) les recherches en cas de vide NODE_PATHet de démarrage du nœud /usr/bin. J'avais donc deux options:

  • lien /usr/lib64/node_modules/npmvers/usr/lib/node_modules/npm
  • déplacer les modules à partir /usr/lib/node_modules/*de /usr/lib64/node_modules/setNODE_PATH=/usr/lib64/node_modules

Les deux fonctionnaient. J'utilise OpenSUSE 42.1 et le package nodejs du référentiel de mises à jour. La version est 4.4.5.


1

Je l'ai fait de manière simple ...

  1. Désinstaller le nœud du panneau de configuration [Windows 7]
  2. Installer à nouveau le nœud
  3. Installez npm install --global --verbose protractor
    le gestionnaire de pilotes Web de mise à jour du rapporteur .

fonctionne bien pour moi.

J'espère que cela vous aidera ....


1

J'ai eu cette erreur Error: Cannot find module 'number-is-nan'alors que le module existe réellement. Cela était dû à une installation Node.js incorrecte / incomplète.

Pour Windows, comme d'autres réponses le suggèrent, vous avez besoin d'une installation Node propre :

  • Désinstaller Node.js
  • Supprimer les deux dossiers npmet npm_cacheenC:\Users\user\AppData\Roaming
  • Redémarrez Windows et installez Node.js
  • Exécutez npm initou ( npm init --yespour la configuration par défaut )
  • Définissez la variable d'environnement Windows pour NODE_PATH. Ce chemin est l'endroit où vos packages sont installés. C'est probablement quelque chose commeNODE_PATH = C:\Users\user\node_modules or C:\Users\user\AppData\Roaming\npm\node_modules
  • Démarrez une nouvelle console cmd et npmdevrait fonctionner correctement

Remarque :

Essayez les derniers points avant de réinstaller Node.js, cela pourrait vous faire gagner du temps et éviter de réinstaller tous vos packages.


1

Je viens de rencontrer ce problème de axios module. Ensuite, j'ai essayé ceci: exécuter rm -rf node_moduleset yarn. Et il fonctionne.


0

J'ai eu la même erreur que l'OP, mais en fouillant dans les journaux, je pouvais voir sh: node: command not found .

Il s'avère que le programme / usr / bin / node (lien symbolique) n'est plus installé avec apt install nodejs. Une fois lié/usr/bin/node' to nodejs, NPM installer -g @ angulaire / cli` réussi.

La bonne façon d'installer ceci sur Debian est apt install nodejs-legacy.


0

J'ai dû ajouter C: \ Users \ {Username} \ AppData \ Roaming \ npm à mes variables env et ensuite j'ai pu installer des trucs.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.