Глобальна установка NPM "не може знайти модуль"


206

Я написав модуль, який я опублікував у npm мить назад (https://npmjs.org/package/wisp)

Таким чином, він встановлений добре з командного рядка:

$ npm i -g wisp

Однак, коли я запускаю його з командного рядка, я постійно отримую помилку, що оптиміст не встановлений:

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

Однак я вказав у package.json як залежність:

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

Хтось знає, що потрібно зробити, щоб це запустити? Я знаю, що це стосується частини біна, що додає виконуваний файл у бін, а node_modules в цьому каталозі порожні. Не знаю, як це вирішити.


що станеться, якщо встановити без параметра -g?
vinayr

Він встановлює папку node_modules в поточному каталозі, яка має wisp всередині цього.
Менцтруаль

Я знаю. Ви все ще отримуєте помилку?
vinayr

Так. Якщо я спробую запустити wisp після локального npm i wisp, все одно повертається та сама помилка
Menztrual

Я щойно встановив ваш модуль. Для мене це добре працює. Де твій вусак? У моєму випадку я побіг, ./node_modules/wisp/wispщо працює чудово.
vinayr

Відповіді:


370

Для всіх, хто зіткнувся з цим, у мене виникла ця проблема через те, що я npmвстановив місце, яке не є моїм NODE_PATH.

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

Мій NODE_PATH порожній, а запущений показ npm install --global --verbose promised-ioпоказав, що він встановлюється в /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]

Мій сценарій не вдається 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)

Можливо, я встановив вузол та npm з джерела, використовуючи configure --prefix=/opt. Я не знаю, чому це зробило їх нездатними знайти встановлені модулі. Наразі виправлення полягає в тому, щоб вказати NODE_PATH у потрібному каталозі:

export NODE_PATH=/opt/lib/node_modules

Моє require('promised-io/promise')зараз успішно.


10
де встановити цей NODE_PATH ??
піщаний

8
@sandy, де ви встановлюєте змінну середовища NODE_PATH, залежить від вашої операційної системи. Я використовую аромат Linux, тому я export NODE_PATH=...встановлював його в локальній оболонці таким чином, щоб він експортувався до команд, що виконуються в цій оболонці. Щоб зміни були стійкими або доступними для всіх оболонок, помістіть їх у .profile або подібне. Концепція в цілому дратує складний для новачків, спробуйте прочитати help.ubuntu.com/community/EnvironmentVariables . Для Windows вам потрібно буде перейти на Linux. Добре, просто жартую. Спробуйте computerhope.com/isissue/ch000549.htm або google.
Neek

13
Для OSX Lion, працюючи для мене ... експортувати NODE_PATH = / usr / local / lib / node_modules Я використовував 'locate node_modules', щоб відстежити правильний шлях.
k1eran

2
NODE_PATH також працює для WINDOWS. це корінням у вузлових модулях, можна встановлювати як локально, так і глобально.
цинкування

5
Якщо ви встановили Node.js з Homebrew на Mac OS X: Запустіть open -a TextEdit ~/.bash_profileу терміналі, а потім додайте export NODE_PATH=/usr/local/lib/node_modulesдо кінця файлу. Перезапустіть вікно терміналу. Тепер біг echo $NODE_PATHповинен роздрукуватись /usr/local/lib/node_modules.
Pwdr

39

додайте це до початку prog (mac):

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


4
Будь-який спосіб зробити це в неособий спосіб?
UpTheCreek

@UpTheCreek - це не специфічний спосіб. Це JS-код, вам просто потрібно вказати на node_modules, у якому є модулі, які ви шукаєте
Adelin

@Adelin - Це специфічне для ОС рішення, оскільки розташування глобальних node_модулів є специфічним для ОС. Наприклад, якщо ви розробляєте вікна та використовуєте Linux у виробництві, то це не чудове рішення.
UpTheCreek

Це легко подолати. Наприклад, ви можете зберегти шлях до вузла в змінній env, наприклад, і замінити твердо кодований шлях на os.environ.nodepath(щось уздовж цих рядків).
Аделін

macOS Mojave 10.14.6 вимагає додавання експорту NODE_PATH = / usr / local / lib / node_modules / npm / node_modules до ~ / bash_profile, який є більш машинним незалежним у зв'язку з тим, що власний код .js не впливає.
vwvan

16

За замовчуванням вузол не дивиться всередині / usr / local / lib / node_module для завантаження глобальних модулів. Перегляньте завантаження модуля, пояснене в http://nodejs.org/api/modules.html#modules_loading_from_the_global_folders

Отже, або вам потрібно 1) додати / usr / local / lib / node_module до NODE_PATH та експортувати його, або 2) скопіювати встановлені модулі вузла в / usr / local / lib / node. (Як пояснено у посиланні для завантаження модуля, вузол буде шукати цей шлях і буде працювати)


10

Для деяких (як я), які більше нічого не працювали, спробуйте це:

brew cleanup
brew link node
brew uninstall node
brew install node

Сподіваюся, це комусь допоможе :)


9

Наступне загальне виправлення стосується будь-якого модуля. Наприклад, с request-promise.

Замініть

npm install request-promise --global

З

npm install request-promise --cli

працював ( джерело ), а також для globalsіinherits

Також спробуйте встановити змінну середовища

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"

Це за замовчуванням. Для користувачів це завантажується, але, хоча він працює як root, це не так, тому його потрібно включати в шлях користувача root.
stamster

2

Для Windows, від Nodejs не вдається знайти встановлений модуль у Windows? те, що працювало для мене, працює за допомогою npm-посилання, як в

npm link wisp

Хоча слово обережності - я це зробив, але не міг потім використовувати свій поштовий код з лямбда AWS. Мені довелося створити node_module локально, як у npm install wisp --save(без опції -g)
PM

2

Для користувачів Mac Mac найкраще скористатися ручною установкою:

Щоб мінімізувати ймовірність помилок дозволів, ви можете налаштувати npm для використання іншого каталогу. У цьому прикладі це буде прихований каталог у вашій домашній папці.

  1. Резервне копіювання комп'ютера перед початком роботи.

  2. Створіть каталог глобальних установок:

    mkdir ~ / .npm-глобальний

  3. Налаштуйте npm для використання нового шляху до каталогу:

    Префікс npm config set '~ / .npm-global'

  4. Відкрийте або створіть файл ~ / .profile і додайте цей рядок:

    експортувати PATH = ~ / .npm-global / bin: $ PATH

  5. Повернувшись до командного рядка, оновіть системні змінні:

    джерело ~ / .profile

  6. Тест: Завантажте пакет у всьому світі, не використовуючи sudo.

    npm install -g jshint

Замість кроків 2-4 ви можете використовувати відповідну змінну ENV (наприклад, якщо ви не хочете змінювати ~ / .profile):

NPM_CONFIG_PREFIX=~/.npm-global

Довідка: https://docs.npmjs.com/getting-started/fixing-npm-permissions


1

Була така ж проблема на одному з тестових серверів, що працює Ubuntuпід root. Потім створюється новий користувач , який використовує useradd -m myuserі встановив все ( nvm, node, пакети) в якості myuser. Зараз це працює чудово.


1

У Windows, якщо ви щойно зробили чисту установку, і ви отримаєте це, вам потрібно зняти кеш npm в \ AppData \ Roaming


1

У моєму випадку обидва nodeі npmбули в одному шляху ( /usr/bin). NODE_PATHБув порожній, тому npmпомістив глобальні модулі в /usr/lib/node_modulesяких require(...)успішно знайти їх. Єдиним винятком став npmмодуль, який постачався разом із пакетом nodejs. Оскільки я використовую 64-бітну систему, вона була розміщена в /usr/lib64/node_modules. Це не де вимагають (...) пошуку в разі порожнього NODE_PATHі вузла, розпочатого з /usr/bin. Тож у мене було два варіанти:

  • посилання /usr/lib64/node_modules/npmна/usr/lib/node_modules/npm
  • переміщувати модулі з /usr/lib/node_modules/*до /usr/lib64/node_modules/та встановлюватиNODE_PATH=/usr/lib64/node_modules

Обидва працювали. Я використовую OpenSUSE 42.1 та пакет nodejs із сховища оновлень. Версія 4.4.5.


1

Я це робив простим способом ...

  1. Видалення вузла з панелі управління [Windows 7]
  2. Установіть вузол ще раз
  3. Встановіть npm install --global --verbose protractor
    диспетчер веб-драйверів оновлення для транспортування .

добре працює для мене.

Сподіваюся, що це допоможе вам ...


1

Я отримав цю помилку, Error: Cannot find module 'number-is-nan'тоді як модуль насправді існує. Це було пов’язано з поганою / неповною установкою Node.js.

Для Windows, як це підказують інші відповіді, потрібна чиста установка Вузла :

  • Видаліть Node.js
  • Видаліть дві папки npmта npm_cacheвC:\Users\user\AppData\Roaming
  • Перезавантажте Windows та встановіть Node.js
  • Запустити npm initабо ( npm init --yesдля конфігурації за замовчуванням )
  • Встановіть змінну середовища Windows для NODE_PATH. На цьому шляху встановлено ваші пакунки. Це, мабуть, щось на кшталтNODE_PATH = C:\Users\user\node_modules or C:\Users\user\AppData\Roaming\npm\node_modules
  • Запустіть нову консоль cmd і npmмає працювати нормально

Примітка :

Спробуйте останні пункти перед перевстановленням Node.js, це може заощадити певний час і уникнути перевстановлення всіх ваших пакетів.


1

Я щойно зустрічався з цією проблемою axiosмодуля. Потім я спробував це: біжи rm -rf node_modulesі yarn. І це працює.


0

У мене була така ж помилка, що і в ОП, але копання по журналах я міг бачити sh: node: command not found.

Виявляється, програма / usr / bin / node (symlink) більше не встановлена apt install nodejs. Після того, як символічне з'єднання /usr/bin/node' tonodejs ,npm install -g @ angular / cli` вдалося.

Правильний спосіб встановити це на debian - це apt install nodejs-legacy.


0

Мені довелося додати C: \ Users \ {Ім'я користувача} \ AppData \ Роумінг \ npm до моїх змінних env, і тоді я можу встановити речі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.