2011-02-18 18 views
19

Złożyłem aplikację na moim komputerze i działa dobrze. Wysłałem go do serwera, a to jest upaść z powodu następującego błędu:node.js nie może znaleźć modułu xml2js

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.<anonymous> (/var/www/node/price/index.js:3:14) 
    at Module._compile (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.<anonymous> (module.js:392:10) 
    at EventEmitter._tickCallback (node.js:108:26) 

W ten sposób rozpoczyna się moja aplikacja:

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

Mam zainstalowany zarówno ekspresowych i xml2js użyciu KMP. Mam dokładnie tę samą wersję (v0.4.0) dla węzła na moim komputerze i moim serwerze.

Upewniłem się, że ścieżka zawierająca xml2js i express reside (/ usr/local/lib/node /) jest zawarta w ścieżkach, w których węzeł szuka modułów. (I edytowany plik „module.js”, by wydrukować ścieżki gdzie szuka modułów.)

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.<anonymous> (/var/www/node/price/index.js:3:14) 
    at Module._compile (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.<anonymous> (module.js:392:10) 
    at EventEmitter._tickCallback (node.js:108:26) 

Więc co jest nie tak? Mam właściwą ścieżkę, moduł jest tam. Dlaczego węzeł nie może go znaleźć? I dokładnie ten sam kod działa płynnie na mojej lokalnej maszynie. Jeśli to ma znaczenie, mój komputer to komputer Mac, a na serwerze działa CentOS.

+1

prawdopodobnie związane: http://groups.google.com/group/nodejs/browse_thread/thread/61d6cf86f1593e10 –

Odpowiedz

0

Spróbuj zainstalować go w projekcie zamiast w globalnym katalogu pakietów.

Jeśli używasz package.json do zarządzania zależnościami, możesz po prostu uruchomić npm bundle w katalogu projektu, a następnie dodać require.paths.unshift('./node_modules') u góry pliku aplikacji. Moim zdaniem jest to najlepsza praktyka dla wszystkich projektów (szczególnie biorąc pod uwagę szybkość, jaką ma rozwój węzła).

3

Węzeł 0.4 wygląda w przypadku ./node_modules dla modułów. Dla mnie to pomogło po prostu połączyć katalog modułów z moim katalogiem projektu z ln -s /usr/local/lib/node node_modules

+0

(lub odwrotnie) –

0

Domyślam się, że prostą odpowiedzią są aktualne pakiety dla xml2js i xml2js-xpat.

Zamiast tego użyłem węzła xml. Szkoda, że ​​xml2js nie był moim pierwszym modułem npm, który próbowałem zainstalować.

11

Jak wspomniano, Węzeł zmienił sposób rozwiązywania modułów. Miałem ten sam problem jak ty i rozwiązane przez zainstalowanie wszystkich modułów globalnie (--global) i dodanie do /usr/local/lib/node_modules wymagają przed wymagając żadnego modułu:

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

że rozwiązał to dla mnie, dzięki. –

+0

To działało dla mnie: 'require.paths.push ('/ usr/lib/node');' – ghbarratt

+0

W środowisku Windows, npm zainstalował moduły w folderze c:/documents i settings zalogowanego użytkownika .. i dla mnie , Musiałem stworzyć nowy folder "node_modules" w katalogu głównym mojego app.js i skopiować foldery xml2js lub inne moduły do ​​nowego folderu node_modules –

0

prostu zrobić ln -s /usr/local/lib/node /usr/local/lib/node_modules, ale przed przenieść zawartość do node_modules oryginalny węzeł biblioteka node - bardzo mi pomógł :)

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

jest nieważne dla v0.8.1 węzła i powyżej. Zamiast używać wymagają.paths.wcisnąć, można ustawić zmienną środowiskową NODE_PATH

export NODE_PATH=/usr/local/lib/node_modules 

lub jeśli instalacja modułów NPM w katalogu domowym, a następnie

export NODE_PATH=~/.npm 
1

Osobiście uważam, że moduł XML2JS musi być zainstalowany przez npm lokalnie. Chociaż próbowałem to tylko na Windows, pisałem na blogu here

Powiązane problemy