Как устранить ошибку «Не удается найти модуль» с помощью Node.js?

617

После извлечения модуля из 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):

В настоящее время вы можете использовать файл package-lock.json , который автоматически генерируется, когда npm изменяет ваш каталог node_modules. Поэтому вы можете не проверять пакеты, потому что package-lock.jsonотслеживает точные версии ваших узлов_модулей, которые вы сейчас используете. Для установки пакетов 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, что «дисковое пространство дешево». У меня есть библиотеки, которые я использую. Мысль о том, что у меня может быть 100 копий (или хуже, около копий), заставляет мой желудок перевернуться. Дисковое пространство дешево, но время обслуживания дорого. Возможно, если вы делаете одноразовый игрушечный проект, обслуживание обходится дешево. Однако для реальной работы техническое обслуживание обходится дорого и не влияет на стоимость дискового пространства.
Ллойд Сарджент
66
Я действительно не понимаю этот последний комментарий. Никто не говорит, что у вас есть 100 копий любого фрагмента кода, просто есть 1 копия кода, от которого зависит ваш проект. Альтернативой может быть нефункциональный проект, если NPM или зависимость исчезают однажды. Я думаю, что переписать зависимость с нуля также довольно дорого. Кроме того, я работал в Microsoft в течение 10 лет, и мы всегда проверяли зависимости сторонних производителей в нашем дереве исходных текстов.
Билл
33
@LloydSargent Наличие «РЯДОМ копий» не хуже, а лучше , потому что у каждого проекта есть определенная зависимость, которую вы определили, а на остальную часть вашего кода полагается. Если у вас были одинаковые версии в нескольких проектах, то если вы обновляете что-либо, вы должны обновить все . Закрепление зависимостей позволяет выполнять частичные обновления - существенно меньше затрат на обслуживание. Реальная работа, не игрушечные проекты.
Дэйв Ньютон,
459

У меня была очень похожая проблема. Удаление всей node_modulesпапки и переустановка работали для меня:

rm -rf node_modules
npm install
Абхинав Сингх
источник
13
Я бы также сделал очистку кеша npm, просто в целях безопасности :)
Тони Тай Нгуен
1
Возможно , хороший первый шаг поиска неисправностей , когда проблема странной зависимости всплывает , что npm install/ npm updateне будет решать. Это решило проблему, из-за которой в Error: Cannot find module 'http-errors'случайном порядке показывалось, когда я пытался запустить приложение Express.
Мэтт Вукас
Удивительно, но ответ @ carelesslyChoosy разрешил недостающую зависимость. Кажется, что обновление и понижение с установкой 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-modules была пуста, и я пытался использовать ng new project-nameее, показывая, что некоторые модули отсутствуют ... Мне пришлось установить их каждый с помощью данной команды. Затем это решило проблему, но Есть ли какая-либо команда, чтобы установить их все сразу?
Вишал Наир
25

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

npm install @types/node --save-dev

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

mgthomas99
источник
18

Это происходит, когда первый нпм по какой-либо причине установка (SIGINT of npm), или если задержка была слишком большой или данные повреждены. Повторная попытка установки npm не спасет проблему.

Что-то пошло не так при первой проверке npm, поэтому лучший выбор - удалить файл и перезапустить установку npm.

Алекс Вернер
источник
16
это поставило мне диагноз. я закончил тем, что сделал npm cache clearи очистил node_modules, а затем решил npm installмою проблему.
Меклариан
9

Если вы используете nvm, убедитесь, что существующие модули_узлов, которые являются привязками к другим библиотекам, скомпилированы для правильной версии 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указывает на файл, который я переместил. Как только я обновил, что ошибка исчезла, и пакет работал.

ukosteopath
источник
2
Святая корова ... в отчаянии я набрал "Ошибка: не могу найти модуль" в Google и нашел этот вопрос. Ваш ответ решил мою проблему. Я не могу поверить, что такой смутный поисковый термин нашел правильный ответ. Слава вам и Google!
Хамон Холмгрен
1
Очень это. Мне удалось указать mainзапись для моего подмодуля в каталоге, который был исключен из его хранилища, поэтому, когда я попытался включить его через npm installнего, это сработало, но экспорт не был найден, когда это необходимо! Большое спасибо за этот очевидный, но полезный ответ.
Dragos
Спасибо за это. У меня была такая ситуация при использовании рабочих пространств Yarn, поэтому я искал алгоритмы разрешения путей и все виды. :) Меня удивило то, что сообщение об ошибке говорит о «нахождении» модуля, а также о том, что ESLint выдает похожие сообщения об ошибках. А потом я увидел твой ответ и понял, что я тупица. Спасибо!
Марк Бирбек
5

Удалите node_moduleкорневую папку из вашего проекта (например:) myApp. Перейдите в myAppпапку и затем введите ниже команду из терминала

>myApp>npm install

Он установит все зависимые модули, необходимые для вашего проекта.

PrashanthiDevi
источник
Не могли бы вы более подробно изложить свой ответ, добавив немного больше описания предлагаемого вами решения?
abarisone
5

С этой ошибкой можно столкнуться, если вы requireиспользуете модуль с отсутствующим или неправильным mainполем в файле package.json. Хотя сам модуль установлен, npm / node должен использовать один файл .js в качестве точки входа в ваш модуль. Если этого mainполя нет, по умолчанию его ищут index.jsв папке вашего модуля. Если основной файл вашего модуля не называется index.js, он не сможет requireэтого сделать.

Обнаружен при превращении browserifyмодуля на основе в модуль CommonJS require; browserifyне заботился о пропавшем mainполе, и поэтому ошибка осталась незамеченной.

MrCranky
источник
4

Укажите путь к папке рестлера, которая будет внутри папки node_modules, например: var rest = require ('./ node_modules / restler');

Это сработало для меня.

Сришти Сингх
источник
3

Если вы используете машинопись и получаете сообщение об ошибке после установки всех узловых модулей, удалите package-lock.json. А потом беги npm install.

Картик Гарасия
источник
2

PRO TIP:

Эта ошибка произошла со мной, борясь с усталостью и легкой болезнью, потому что я печатал 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

Надеюсь, это поможет кому-то!

Соумья Канти
источник
Спасибо за напоминание. В моем случае это был package-lock.json, который снова все испортил, но после удаления и node_modules снова npm installвсе работает хорошо.
TaeKwonJoe
6
Если вы удалите, package.jsonкак NPM знает, что установить?
Михал
1

Я могу добавить еще одно место для проверки; пакет, который я пытался использовать, был другим из моих собственных пакетов, которые я опубликовал для частного репозитория NPM. Я забыл правильно настроить свойство 'main' в package.json. Итак, пакет находился в папке node_modules потребляющего пакета, но я получал сообщение «не могу найти модуль». Мне понадобилось несколько минут, чтобы понять мою ошибку. :-(

martinp999
источник
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/
Кал
источник
1

В Appsome Solutions у нас была такая же проблема с конфигурацией нашего машинописного проекта, и мы добавили ее "moduleResolution": "node",в tsconfig.json, чтобы решить ее.

Патрик Яник
источник
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

Может быть, как и я, вы установили «механизм просмотра» в экспрессе на механизм, который не существует, или попытались использовать незарегистрированный шаблонизатор. Убедитесь, что вы используете: 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

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

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

Итак, добавляя и развивая ответ, предоставленный PrashanthiDevi , а также добавляя мой личный опыт, вот оно:

Я новичок во всей части e2e и модульных тестов. Я начал изучать эту часть от транспортира . Теперь у меня уже были файлы, в которых были написаны тесты, но мне пришлось запускать тесты.

Я уже установил все необходимые программы и инструменты, но когда я первоначально запустил код для запуска тестов gulp itest, я получил эту ошибку «Не удается найти модуль» . Пройдя много разных вопросов по SO, я нашел один ответ, который, как мне казалось, мог бы помочь найти решение.

Человек предложил запустить команду npm installв папке моего проекта.

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

(Следующая часть может быть неуместна в этом вопросе, но может быть полезна, если кто-то сталкивался с той же ситуацией, с которой я столкнулся.)

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

Тем не менее, решение этой ошибки было довольно глупо (и смешно) для меня. У меня уже был файл chromedriver в моей папке селена . Но, оказывается, что вышеупомянутая ошибка прибыла, потому что мои файлы chromedriver были в папке selenium, а не в папке chromedriver . Итак, создание папки chromedriver и копирование туда файлов chromedriver решило мою проблему!

Кроме того, для ошибки: Тайм-аут ожидания сервера WebDriver , вы можете добавить эту строку кода в файл conf.js внутри exports.config{}:

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

Надеюсь это поможет!

HardikT
источник
-4

Я получил простое решение, чтобы решить эту проблему.

Просто удалите C: \ Users \ Имя пользователя \ AppData \ Roaming \ npm \

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

Теперь ваша проблема будет решена.

Gangadhar
источник
Он использует Unix. Не винда.
Саиф Аль Фалах
-4

Запустите только следующую команду:

npm install

Он установит все необходимые модули в node_modulesпапке.

mohsin139
источник
-5
rm -rf node_modules
npm install
npm fund

это работа для меня.

AndriyFM
источник
-38

Измените каталог и укажите текущую папку проекта, а затем «npm install». ,

Это установит все зависимости и модули в папку вашего проекта.

emekaokoli
источник
2
этот ответ не кажется неправильным, я чувствую, что отрицательное голосование является результатом некоторой предвзятости и поддержки саркастических комментариев.
Muxsith
2
так много отрицательных голосов это слишком много. Это не совсем расплывчато. Это относится к принятому ответу. Все, что говорит ответ, это делать npm installв правильном каталоге. В этом нет ничего такого негативного
шиноби