#Что означает ошибка
npm ERR! code EACCES npm ERR! syscall access permission denied
«npm ERR! code EACCES … permission denied» означает, что у вашего пользователя нет прав записи в каталог, куда npm устанавливает пакеты, чаще всего в системный /usr/lib/node_modules или /usr/local/lib/node_modules. Решение с sudo npm install -g работает, но создаёт проблемы с правами в дальнейшем и небезопасно: скрипты пакетов выполняются от root. Правильнее настроить пользовательский каталог для глобальных пакетов или использовать менеджер версий Node (nvm).
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Глобальный каталог принадлежит rootУстановка в системный каталог. | ls -ld показывает root. | Смените prefix. |
| Установлено через sudo ранееФайлы стали принадлежать root. | Ошибки после использования sudo. | Исправьте владельца. |
Кэш принадлежит root~/.npm принадлежит root. | Ошибка кэша. | Исправьте. |
| Нет прав на каталог проектаПроект в чужом каталоге. | Ошибка при npm install. | Проверьте права. |
#Пошаговое решение
- Определите prefixОшибка
EACCESприnpm install -gна Linux/macOS означает отсутствие прав записи в выбранный каталог; инструкция с пользовательским каталогом ниже НЕ предназначена для Windows. Откройте «Терминал» и выполнитеnpm config get prefix; запишите вывод. Если там системный путь вроде/usr/local, не меняйте его владельца рекурсивно и не устанавливайте npm-пакеты глобально черезsudo. Самый простой вариант — установить Node.js через диспетчер версий, а настройка собственного каталога ниже служит альтернативой. - Создайте каталогЕсли вы выбрали вариант с пользовательским каталогом, в терминале Linux/macOS выполните
mkdir -p "$HOME/.local". Команда создаст каталог внутри вашего профиля; обычно права администратора не нужны. Убедитесь, что он существует командойls -ld "$HOME/.local"; если видите «Permission denied» даже дома, проверьте собственность каталога прежде чем продолжать. - Задайте prefixВ том же терминале выполните
npm config set prefix "$HOME/.local", затемnpm config get prefix. Во втором выводе должен появиться абсолютный путь к вашему домашнему каталогу. Важно: ставьте двойные кавычки, не записывайте~в одинарных кавычках — тогда символ может остаться буквальным и путь окажется неправильным. - Добавьте в PATHНа Linux с bash откройте
~/.profileв текстовом редакторе (nano ~/.profile), в конец один раз добавьтеexport PATH="$HOME/.local/bin:$PATH", сохраните Ctrl+O → Enter → Ctrl+X. Для zsh добавьте в~/.zprofileстрокуsource ~/.profile, если она ещё не существует. Для другой командной оболочки используйте её файл запуска. Каталог.local/binдолжен быть вPATHименно в новой терминальной сессии. - ПрименитеВ терминале bash выполните
source ~/.profileили полностью закройте и заново откройте окно; для zsh предварительно настройте~/.zprofile, затем откройте новое окно. Проверьтеecho "$PATH": в списке должен быть путь/home/ваш_пользователь/.local/bin(на macOS каталог другой). Если его нет, убедитесь, что редактировали файл запуска вашей оболочки. - Исправьте кэшШаг нужен лишь когда в сообщении
EACCESупомянут кэш~/.npm, а не каталог установки. Выполнитеls -ld "$HOME/.npm", чтобы узнать владельца. Если каталог действительно принадлежит root после старых запусков sudo, администратор может исправить собственность только этого каталога:sudo chown -R "$(id -u):$(id -g)" "$HOME/.npm". Эта команда меняет владельца файлов: не применяйте её к системномуnode_modulesили чужим каталогам. - Повторите установкуПосле настройки выполните пример из документации
npm install -g npm-check-updatesбез sudo; после окончания введитеncu --version. Если оболочка сообщаетcommand not found, вернитесь к шагу с PATH. Для нужного пакета заменитеnpm-check-updatesна точное имя из официальной инструкции проекта; используйтеnpxвместо постоянной установки, если команда нужна однократно. - Используйте nvmАльтернативный, рекомендуемый npm вариант — диспетчер версий Node.js. Откройте документацию Node.js/npm по установке через менеджер версий для вашей ОС; установите менеджер по официальной инструкции, затем версию Node LTS и проверьте
node -v,npm -v,npm config get prefix. Не смешивайте одновременно два способа: если переходите на менеджер версий, удалите ранее внесённый пользовательскийprefixкомандойnpm config delete prefixв нужной конфигурации и откройте новый терминал. - Дополнительная команда по темеLinux · Терминал (Bash)С осторожностьюАльтернатива менеджеру версий Node; без автоматической рекурсивной смены владельца и без обновления npm@latest
# Linux/macOS, пользовательский каталог; НЕ запускать с sudomkdir -p "$HOME/.local"npm config set prefix "$HOME/.local"# В ~/.profile один раз добавьте: export PATH="$HOME/.local/bin:$PATH"# Для zsh подключите ~/.profile из ~/.zprofile и откройте новый терминалnpm config get prefix# Проверка после настройки PATHnpm install -g npm-check-updatesncu --versionКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
Если ошибка возникает при npm install в рабочем проекте, а не при глобальной установке, откройте терминал в каталоге проекта и посмотрите владельца именно проблемных файлов (ls -ld . node_modules и полный путь из сообщения EACCES). Если файлы принадлежат другому пользователю или созданы контейнером, согласуйте с владельцем исправление прав конкретного каталога; не запускайте рекурсивный chown над всем проектом автоматически. В Docker настройте пользователя контейнера и владельца подключённого тома. Для установки из сохранённого package-lock.json в контролируемом проекте используйте npm ci, понимая, что эта команда пересоздаёт node_modules.
Если ошибка возникает в CI или контейнере, проверьте пользователя, которому принадлежит каталог кэша npm и рабочая папка, а также права подключённых томов. Когда проблема связана только с пересоздаваемыми зависимостями проекта, сначала сохраните важные локальные изменения и убедитесь в наличии правильного package-lock.json, затем запустите npm ci из каталога нужного проекта: эта команда сама удаляет и переустанавливает содержимое node_modules. Для глобального EACCES предпочтительнее менеджер версий Node.js или пользовательский prefix из инструкции выше.