node.js ne peut pas trouver le module xml2js

J’ai fait une application sur ma machine et ça marche bien. Je l’ai téléchargé sur le serveur et il se bloque avec l’erreur suivante:

node.js:116 throw e; // process.nextTick error, or 'error' event on first tick ^ Error: Cannot find module 'xml2js' at Function._resolveFilename (module.js:289:11) at Function._load (module.js:241:25) at require (module.js:317:19) at Object. (/var/www/node/price/index.js:3:14) at Module._comstack (module.js:373:26) at Object..js (module.js:379:10) at Module.load (module.js:305:31) at Function._load (module.js:271:10) at Array. (module.js:392:10) at EventEmitter._tickCallback (node.js:108:26) 

Voici comment mon application démarre:

 var express=require('express'); var http=require('http'); var xml2js = require('xml2js'); var sys = require('sys'); var util = require('util'); 

J’ai installé à la fois express et xml2js en utilisant npm. J’ai exactement la même version (v0.4.0) pour le noeud sur ma machine et mon serveur.

Je me suis assuré que le chemin où résident xml2js et express (/ usr / local / lib / node /) est inclus dans les chemins où noeud recherche les modules. (J’ai édité le fichier ‘module.js’ pour imprimer les chemins où il recherche des modules.)

 node.js:116 throw e; // process.nextTick error, or 'error' event on first tick ^ Error: Cannot find module 'xml2js', in paths: /root/.node_modules,/root/.node_libraries,/usr/local/lib/node,/var/www/node/price/node_modules,/var/www/node/node_modules,/var/www/node_modules,/var/node_modules,/node_modules at Function._resolveFilename (module.js:289:11) at Function._load (module.js:241:25) at require (module.js:317:19) at Object. (/var/www/node/price/index.js:3:14) at Module._comstack (module.js:373:26) at Object..js (module.js:379:10) at Module.load (module.js:305:31) at Function._load (module.js:271:10) at Array. (module.js:392:10) at EventEmitter._tickCallback (node.js:108:26) 

Alors, qu’est-ce qui ne va pas? J’ai le bon chemin, le module est là. Pourquoi ne pas trouver le noeud? Et le même code fonctionne parfaitement sur ma machine locale. Si c’est important, ma machine est un Mac et le serveur exécute CentOS.

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

n’est plus valide pour le noeud v0.8.1 et supérieur. Au lieu d’utiliser require.paths.push , vous pouvez définir la variable d’environnement NODE_PATH

 export NODE_PATH=/usr/local/lib/node_modules 

ou si vous installez des modules npm dans votre répertoire personnel, alors

 export NODE_PATH=~/.npm 

Comme mentionné dans Spmason, Node a changé la façon dont les modules sont résolus. J’ai eu le même problème que vous et je l’ai résolu en installant tous les modules globalement ( --global ) et en ajoutant /usr/local/lib/node_modules à l’exigence avant de nécessiter n’importe quel module:

 require.paths.push('/usr/local/lib/node_modules'); require('blah'); // it works! 

Le nœud 0.4 a changé la façon dont les modules sont résolus et il semble que cela interrompt xml2js .

Le noeud 0.4 recherche les modules ./node_modules . Pour moi, cela m’a aidé de lier simplement le répertoire des modules à mon répertoire de projet avec ln -s /usr/local/lib/node node_modules

Personnellement, j’ai trouvé que le module XML2JS devait être installé via npm localement. Bien que je ne l’aie essayé que sous Windows, j’ai écrit un article de blog ici

Essayez de l’installer dans le projet au lieu du répertoire global du package.

Si vous utilisez un package.json pour gérer les dépendances, vous pouvez simplement exécuter npm bundle dans le répertoire du projet, puis append require.paths.unshift('./node_modules') en haut de votre fichier d’application. A mon avis, c’est la meilleure pratique pour tous les projets (surtout compte tenu de la vitesse à laquelle le développement du nœud a lieu).

Je suppose que la réponse simple est que les paquets actuels pour xml2js et xml2js-xpat sont cassés.

J’ai fini par utiliser node-xml à la place. Je souhaite que xml2js n’ait pas été mon premier module npm que j’ai essayé d’installer.

Il suffit de faire ln -s /usr/local/lib/node /usr/local/lib/node_modules , mais avant de déplacer le contenu de node_modules dans le noeud initial de la bibliothèque du node – cela m’a aidé 🙂