Node.js не может найти модуль 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)
Вот как начинается мое приложение:
var express=require('express');
var http=require('http');
var xml2js = require('xml2js');
var sys = require('sys');
var util = require('util');
Я установил как express, так и xml2js, используя npm. У меня есть такая же версия (v0.4.0) для node на моей машине и на моем сервере.
Я убедился, что путь wher xml2js и express reside (/usr/local/lib/ node/) включен в пути, где node ищет модули. (Я редактировал файл 'module.js' для печати путей, где он ищет модули.)
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)
Итак, что не так? У меня есть правильный путь, модуль есть. Почему он не может найти node? И тот же самый код работает плавно на моей локальной машине. Если это имеет значение, моя машина Mac, а на сервере работает CentOS.
Ответы
Ответ 1
require.paths.push('/usr/local/lib/node_modules');
больше не действует для node v0.8.1 и выше. Вместо require.paths.push вы можете установить переменную среды NODE_PATH
export NODE_PATH=/usr/local/lib/node_modules
или если вы устанавливаете модули npm в своем домашнем каталоге, то
export NODE_PATH=~/.npm
Ответ 2
Как упоминалось spmason, Node изменил способ устранения модулей. У меня была такая же проблема, как и у вас, и разрешила ее, установив все модули по всему миру (--global
) и добавив /usr/local/lib/node_modules
к требованию перед требованием любого модуля:
require.paths.push('/usr/local/lib/node_modules');
require('blah'); // it works!
Ответ 3
Node 0.4 изменилось, как modules разрешены и появляется, что это разрывает xml2js.
Ответ 4
Node 0.4 выглядит для ./node_modules
для модулей.
Для меня это помогло просто связать каталог модулей с моим каталогом проектов с помощью ln -s /usr/local/lib/node node_modules
Ответ 5
Лично я обнаружил, что модуль XML2JS должен быть установлен через npm локально. Хотя я только пробовал это в Windows, я написал сообщение в блоге здесь
Ответ 6
Попробуйте установить его в проекте вместо глобального каталога пакетов.
Если вы используете package.json
для управления зависимостями, вы можете просто запустить npm bundle
в каталоге проекта, а затем добавить require.paths.unshift('./node_modules')
в начало вашего файла приложения. По-моему, это наилучшая практика для всех проектов (особенно учитывая скорость развития node).
Ответ 7
Я предполагаю, что простой ответ - текущие пакеты для xml2js и xml2js-xpat выгружены.
В итоге я использовал node -xml. Я хочу, чтобы xml2js не был моим первым модулем npm, который я пытался установить.
Ответ 8
просто сделайте ln -s /usr/local/lib/node /usr/local/lib/node_modules
, но перед перемещением содержимого node_modules
в исходную библиотеку node node
- это помогло мне:)