Як вирішити помилку "Неможливо знайти модуль" за допомогою Node.js?


616

Після витягування модуля з GitHub і дотримуючись інструкцій зі його створення, я намагаюся втягнути його в існуючий проект, використовуючи:

> npm install ../faye

Здається, це зробити фокус:

> npm list
/home/dave/src/server
└─┬ faye@0.7.1
  ├── cookiejar@1.3.0
  ├── hiredis@0.1.13
  └── redis@0.7.1

Але Node.js не може знайти модуль:

> node app.js
node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: Cannot find module 'faye'
    at Function._resolveFilename (module.js:334:11)
    at Function._load (module.js:279:25)
    at Module.require (module.js:357:17)
    at require (module.js:368:17)
    at Object.<anonymous> (/home/dave/src/server/app.js:2:12)
    at Module._compile (module.js:432:26)
    at Object..js (module.js:450:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Array.0 (module.js:470:10)

Мені дуже хочеться зрозуміти, що тут відбувається, але я трохи втрачаю, де шукати далі. Будь-які пропозиції?


8
Очікується, що node_modulesкаталог буде в корені вашого проекту, а також app.jsу вашому випадку. Чому ви використовували ..шлях встановлення npm?
Алекс Уейн

1
Після зміни "npm install ../faye" на "npm install ../faye/build" воно працює як очікувалося. Я не знаю, наскільки це типово, але Faye створює каталог збирання, коли він створюється, і кладе туди копію package.json. npm не скаржиться на package.json на кореневому рівні, але він посилається на файли, які не існують на цьому рівні.
Дейв Косі

2
Я вирішив проблему, але насправді не отримав жодного вирішення мого реального питання, яке було вирішити цю проблему. Я спробую запропонувати декілька пропозицій щодо покращення npm та / або вузла, щоб полегшити новичкам уникнути цієї ситуації.
Дейв Косі

1
Перейшовши через це посилання , ви можете зрозуміти, де саме не вдалося знайти свої модулі ..
Amol M Kulkarni

1
Перевірте погоду, що ви знаходитесь в тій же папці, де її встановили? якщо ви її не встановили глобально.
Ашвані Панвар

Відповіді:


513

Використовуючи npm installвстановлення модуля лише у поточному каталозі (у підкаталозі під назвою node_modules). Чи розміщено app.js під home/dave/src/server/? Якщо ні, і ви хочете використовувати модуль з будь-якого каталогу, вам потрібно встановити його глобально, використовуючи npm install -g.

Я зазвичай встановлюю більшість пакетів локально, щоб вони отримували реєстрацію разом із кодом мого проекту.

Оновлення (8/2019):

Сьогодні ви можете використовувати пакет-lock.json файл, який автоматично генерується, коли npm модифікує ваш каталог node_modules. Тому ви можете залишити перевірку в пакунках, оскільки package-lock.jsonвідслідковує точні версії ваших node_модулів, які ви зараз використовуєте. Для встановлення пакунків package-lock.jsonзамість цього package.jsonвикористовуйте команду npm ci.

Оновлення (3/2016):

Я отримав багато виправдань за свою відповідь, зокрема, що я перевіряю пакети, від яких залежить мій код. Кілька днів тому хтось опублікував усі свої пакунки ( https://kodfabrik.com/journal/i-ve-just-liberated-my-modules ), які зламали React, Babel та майже все інше. Сподіваємось, зараз зрозуміло, що якщо у вас є виробничий код, ви не можете розраховувати на те, що NPM фактично підтримує ваші залежності для вас.


264
"Я зазвичай встановлюю більшість пакетів локально, щоб вони отримували реєстрацію разом із кодом мого проекту." Зазвичай краще скласти package.jsonсписок, від яких npm-модулів залежать, і проігнорувати node_modulesпапку. Тоді просто npm installдля налаштування після клонування репо.
Алекс Уейн

53
Крім package.jsonперерахування залежностей, мені подобається зберігати відомі хороші копії речей, від яких я залежу. Місце на диску дешево, і якщо npm або пакет зникне з npm, у мене все ще буде повністю працюючий проект у моїй репо.
Білл

165
Як старий розробник я ледь не захлинувся, коли читав «Парадигму» Node devs, що «дисковий простір дешевий». У мене є бібліотеки, якими я користуюся. Ідея про те, що я можу мати 100 примірників (або, що ще гірше, Близькі копії), змушує живіт повернутися. Місце на диску - це дешево, але час обслуговування дорогий. Можливо, якщо ви робите проект разової іграшки, обслуговування дешеве. Однак для реальної роботи технічне обслуговування дороге і не має ніякого відношення до вартості місця на диску.
Ллойд Сарджент

66
Я справді не розумію цього останнього коментаря. Ніхто не каже, що у вас є 100 копій будь-якого фрагмента коду, просто мати 1 копію коду, від якого залежить ваш проект. Альтернативою є створення нефункціонального проекту, якщо NPM або залежність зникне одного дня. Я думаю, переписувати залежність з нуля також досить дорого. Як осторонь, я працював у Microsoft 10 років, і ми завжди мали сторонні залежності, перевірені в нашому вихідному дереві.
Білл

33
@LloydSargent Наявність "NEAR копій" не гірше, це краще , тому що кожен проект має певну залежність, яку ви визначили, і решта вашого коду покладається на. Якщо у вас були однакові версії для декількох проектів, тоді, якщо ви оновлюєте що- небудь , потрібно оновити все . Залежні залежності дозволяють покращити деталізацію - значно менше обслуговування. Справжня робота, неіграшні проекти.
Дейв Ньютон

459

У мене було дуже схоже питання. Видалення всієї node_modulesпапки та повторна інсталяція працювали для мене:

rm -rf node_modules
npm install

13
Я б також зробив кеш-пам'ять в чистоті, як безпеку :)
Tony Tai Nguyen

1
Можливо, вдалий перший крок усунення несправностей, коли виникає дивна проблема залежності, яка npm install/ npm updateне вирішить. Це вирішило проблему, коли Error: Cannot find module 'http-errors'випадково почали показуватися, коли я намагався запустити свою програму Express.
Метт Вукас

Дивовижна, @ недбало відповідь Choosy вирішила відсутність залежності. Здається, оновлення та пониження версії з встановленням npm на місці не підтримують порядок.
вугор ghEEz

3
Тут відсутній крок - видалити файл package-lock.json перед запуском npm install.
Рік Кванц

це не спрацювало для мене, навіть перезавантажив комп’ютер;)
Джейсон Г

83
npm install --save module_name

Наприклад, якщо помилка:

{[Помилка: Неможливо знайти модуль '/root/.npm/form-data'] код: 'MODULE_NOT_FOUND'}

тоді ви можете вирішити цю проблему, виконавши команду npm install --save form-data.


1
здається, що коли я встановив її глобально, папка npm / node-module була порожньою, і я намагався її використовувати, ng new project-nameпоказуючи, що деякі модулі відсутні, я повинен був встановити їх кожен за допомогою даної команди. Потім це вирішило проблему, але це є якась одна команда, щоб встановити їх усі відразу?
Вішал Наїр

25

Для користувачів TypeScript, якщо ви імпортуєте вбудований модуль Node (наприклад http, pathабо url), і ви отримуєте помилку, таку як "Cannot find module "x"помилку можна виправити, запустивши

npm install @types/node --save-dev

Команда імпортує визначення NodeJS TypeScript у ваш проект, дозволяючи використовувати вбудовані модулі Node.


18

Це трапляється, коли перша установка npm вийшла з ладу з якоїсь причини (SIGINT npm), або якщо затримка була занадто довгою, або дані пошкоджені. Повторна спроба встановити npm не врятує проблему.

Щось помилилося під час першої перевірки npm, тому найкращим вибором є видалення файлу та перезапуск установки npm.


16
це діагностувало проблему для мене. Я закінчив робити npm cache clearта очищати node_modules з подальшим npm installвирішенням своєї проблеми.
meklarian

9

Якщо ви використовуєте nvm, перевірте, чи наявні node_modules, які пов'язують інші бібліотеки, скомпільовані для правильної версії Node.js.

У мене була така ж помилка. Причина полягала в наступному: ми використовуємо nvm, оскільки на сервері ми запускаємо дві програми, для одного потрібен Node.js 5.6, оскільки він використовує node-gd (який наразі не працює на Node.js 6), інший вимагає Node.js 6. Node.js 6 - це встановлення apt-get .

Також ми використовуємо інструмент pm2 для розгортання.

Отже, налаштування за замовчуванням полягає в тому, що процес pm2 запускається тоді, коли nvm не діє, тому він використовує встановлення apt-get Node.js (версія 6). Отже, основний демон pm2 починається з Node.js 6. Якщо я запускаю програми в режимі fork, вони запускаються в окремих процесах і діють налаштування nvm. Коли я запускаю програми в кластерному режимі - вони успадковують не nvm середовище.

Отже, коли я спробував перейти в режим кластера, програма не запустилася, оскільки прив’язки, складені для 5.6, не підтримують це повідомлення.

Я це виправив, перезавантаживши pm2, коли діє сеанси nvm. Також слід виправити сценарії запуску.


Як ви це перевіряєте?
tamj0rd2

8

Перевірте, чи правильно встановлено змінну навколишнього середовища NODE_PATH та вказує на шлях node_modules. nodejs використовує цю змінну для пошуку бібліотек


Я upvoted це , як це вирішити мою проблему відразу ж, і привів мене до цього Node.js документації . Але я думаю, що це не бланкетна відповідь, оскільки документація вказує альтернативні стратегії розміщення модулів.
Грем Клін

6

Я вчора відчув цю помилку. Зайняв мене деякий час, щоб зрозуміти, що mainзапис package.jsonвказує на файл, який я перемістив. Одного разу я оновив, що помилка зникла і пакет працював.


2
Свята корова ... з відчаю я набрав у Google "Помилка. Неможливо знайти модуль" і знайшов це питання. Ваша відповідь вирішила мою проблему. Не можу повірити, що такий невиразний пошуковий термін виявив правильну відповідь. Кудо вам і Google!
Джеймон Холмгрен

1
Дуже сильно це. Мені вдалося вказати mainзапис мого підмодуля в каталог, який був виключений із його сховища, тому коли я намагався включити його через npm installнього, працював, але експорт не був знайдений, коли потрібно! Велике спасибі за цю очевидну, але корисну відповідь.
Dragos

Дякую за це У мене була така ситуація, коли я використовував робочі простори Пряжі, тому шукав по всьому алгоритми вирішення шляхів і всілякі. :) Мене відкинуло те, що повідомлення про помилку говорить про "локалізацію" модуля, а також про те, що ESLint надсилав подібні повідомлення про помилки. І тоді я побачив твою відповідь і зрозумів, що я нерозумний. Дякую!
Марк

5

Видаліть свою node_moduleкореневу папку зі свого проекту (наприклад:) myApp. Перейдіть у myAppпапку та введіть нижче команду з терміналу

>myApp>npm install

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


Не могли б ви детальніше розглянути свою відповідь, додавши трохи більше опису про рішення, яке ви надаєте?
абарізон

5

З цією помилкою можна зіткнутися, якщо ви requireвикористовуєте модуль, у якому відсутнє або неправильне mainполе в його пакет.json. Хоча сам модуль встановлений, npm / вузол повинен використовувати один файл .js як вхідну точку до вашого модуля. Якщо цього mainполя немає, воно за замовчуванням шукає index.jsв папці вашого модуля. Якщо основний файл вашого модуля не називається index.js, він не зможе requireйого.

Виявлений під час перетворення browserifyмодуля на основі базування в модуль, що працює на CommonJS require; browserifyне піклувалося про відсутнє mainполе, і тому помилка залишилася непоміченою.


4

Вкажіть шлях до папки restler, яка буде знаходитись всередині папки node_modules, наприклад: var rest = requ ('./ node_modules / restler');

Це працювало для мене.


3

Якщо ви використовуєте машинопис і отримуєте помилку після установки всіх модулів вузла, тоді видаліть package-lock.json. А потім біжи npm install.


2

ПОРАДА ПРО:

Ця помилка трапилася зі мною під час боротьби з втомою та легкою хворобою, бо я набрав node blahзамість цьогоnpm blah .

Отримане повідомлення про помилку не було достатньо гнівним, щоб сповістити мене про свою дурість!


2

Я зіткнувся з тією ж проблемою, коли хтось інший в команді оновлювався package.jsonв SVN. Просто видалення node_modulesкаталогу не допомогло. Як я вирішив проблему:

rm -rf node_modules
rm package.json
rm package-lock.json
svn up
npm install
ng build --env=prod

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


Дякуємо за нагадування. У моєму випадку це пакет-lock.json знову зіпсував речі, але після видалення його та node_modules потім npm installзнову все добре.
TaeKwonJoe

6
Якщо ви видалите, package.jsonяк NPM знає, що встановити?
Michał

1

Я можу додати ще одне місце для перевірки; пакет, який я намагався використати, був ще одним моїм власним пакетом, який я опублікував у приватному репо-репліці NPM. Я забув правильно налаштувати "головне" властивість у package.json. Отже, пакет був там у папці node_modules споживчого пакету, але я отримував "не можу знайти модуль". Мені знадобилося кілька хвилин, щоб усвідомити свою помилку. :-(


1

У моєму випадку я UNMET PEER DEPENDENCY redux@^3.0.0викликав це повідомлення про помилку, перегляньте їх усі та знову встановіть відсутні модулі за допомогою --save

npm install redux --save

1

Видалення вузла / npm, а потім повторна інсталяція стабільної (не останньої) версії працювала для мене.

sudo rm -rf /usr/local/{lib/node{,/.npm,_modules},bin,share/man}/{npm*,node*,man1/node*}

https://nodejs.org/en/download/


0

Я намагався опублікувати власний пакет, а потім включити його до іншого проекту. У мене виникло це питання через те, як я побудував перший модуль. Я використовую експорт ES2015 для створення модуля, наприклад, скажемо, що модуль виглядає так:

export default function(who = 'world'){
    return `Hello ${who}`;
}

Після складання з Бабелем і перед публікацією:

'use strict';

Object.defineProperty(exports, "__esModule", {
    value: true
});

exports.default = function () {
    var who = arguments.length <= 0 || arguments[0] === undefined ? 'world' : arguments[0];


    return 'Hello ' + who;
};

Тому після npm install module-nameіншого проекту (жодного ES2015) мені не довелося це робити

var hello = require('module-name').default;

Насправді пакет імпортувався.

Сподіваюся, що це допомагає!


0

Зустріли цю проблему під час використання webpackс webpack-dev-middleware.

Перетворив один файл у папку .

Зберігач, здавалося, не бачив нової папки, і модуль відсутній.

Виправлено шляхом перезавантаження процесу.


0

Щойно знайшов незвичний сценарій, який може комусь корисний і є своєрідною червоною оселедець.

Я також отримував помилку модуля Cannot Find Module, але як не дивно, все працювало чудово в моєму локальному середовищі (на базі Mac) Node.js. Ця проблема з’явилася лише тоді, коли код розгорнувся на нашому сервері Linux.

Ну ... виявилося помилковим помилкою, що (мабуть) установка Node.js на базі Mac була абсолютно рада ігнорувати.

Включити виглядало так:

var S3Uploader = require('./S3Uploader.class');

Але власне файл називався "s3Uploader.class.js"

Зауважте різницю корпусу в 's' проти 'S' між кодом та назвою файлу.

Отже - у випадковому випадку, що жодне з інших рішень тут не вирішує вашу проблему, потрійно переконайтесь, що ви не помилково вводите символи у вказане ім’я файлу! :)

і ДУХ!


1
За замовчуванням файлова система osx (HFS +) є нечутливою до регістру ... виявлена ​​не так давно, вона, безумовно, може бути налаштована, хоча
giulp

0

Можливо, як я, ви встановили "view engine" в експресі на двигун, який не існує, або спробували використовувати незареєстрований двигун шаблонів. Переконайтеся, що ви використовуєте: app.engine('engine name',engine) app.set('view engine','engine name')


0

Встановіть новий CLI v3 (npm install -g ionic @ latest).

Якщо ця проблема все ще залишається проблемою в CLI v3. Дякую!


0

Якщо пакет встановлений успішно, перейдіть до папки node_modules, тоді перевірте файл та шлях. Потім імпортуйте. Сподіваюсь, це допомагає.


-3

Перш за все, так, частина моєї відповіді, безумовно, корисна для вирішення помилки, яку розміщує ОП. По-друге, спробувавши нижченаведений крок, я зіткнувся з парою інших помилок і, таким чином, написав рішення і для них.

(Psst! Я не впевнений, чи успішно я допомагав у вирішенні вищезгаданої помилки, чи порушив якесь правило чи формат відповідей, але я зіткнувся з вищевказаною помилкою та деякими іншими, і мені знадобилося багато часу, щоб знайти належні рішення для цих помилок. Я пишу повне рішення, тому що, якщо хтось інший також зіткнеться з цими помилками, він, сподіваємось, тут знайде рішення.)

Отже, доповнення та розробка відповіді, яку надав ПрашантіДеві , а також додати мій особистий досвід, ось це:

Я новачок у всій частині тестів e2e та unit. Я почав розглядати цю частину з транспортувальника . Тепер у мене вже були файли, в яких були написані тести, але мені довелося запустити тести.

Я вже встановив усі необхідні програмні засоби та інструменти, але коли я спочатку запустив код для запуску тестів gulp itest, я отримав цю помилку "Не можу знайти модуль" . Переглянувши багато різних питань щодо SO, я знайшов одну відповідь, яку, на мою думку, може допомогти знайти рішення.

Людина запропонував запустити команду npm installв моїй папці проекту.

Причиною для цього було оновлення вузлів-модулі папки, в нашій папці проекту, з усіма необхідними і необхідними файлами і залежностями.

(Нижня частина може не стосуватися цього питання, але може бути корисною, якщо хтось зіткнеться з тією ж ситуацією, з якою я стикався.)

Наведений вище крок, безумовно, вирішив мою попередню помилку, але кинув нову! Цього разу помилка була Could not find chromedriver at '..\node_modules\protractor\selenium\chromedriver'.

Однак рішення цієї помилки було для мене досить нерозумним (і смішним). У мене в папці з селеном у мене вже був файл Chromeedriver . Але, виявляється, вищезгадана помилка виникла через те, що мої файли Chromeedriver знаходилися всередині папки селену, а не всередині папки Chromeedriver . Отже, створення папки Chromeedriver і копіювання файлів хромедрівера там вирішили мою проблему!

Крім того, для помилки: вимкнувши час очікування сервера WebDriver , ви можете додати цей рядок коду до файлу conf.js всередині exports.config{}:

seleniumAddress: 'http://localhost:8080/'

Сподіваюся, це допомагає!


-4

Я отримав просте рішення для вирішення цього питання.

Просто видаліть C: \ Users \ UserName \ AppData \ Roaming \ npm \

а потім встановити вузол.

Тепер ваша проблема буде вирішена.


Він використовує Unix. Не Windows.
Сайф Аль Фалах

-4

Виконайте лише таку команду:

npm install

Він встановить усі необхідні модулі в node_modulesпапку.



-38

Змініть каталог і вкажіть на поточну папку проекту, а потім "npm install". .

Це встановить усі залежності та модулі у вашу папку проекту.


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

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