✦ Oplossingen · Server- en developerfouten

npm ERR! code EACCES: permission denied bij npm install -g

‘npm ERR! code EACCES’ bij npm install -g? npm mag niet schrijven in de globale map. Zo los je het op zonder sudo, met nvm of een eigen prefix.

Zo ziet de foutmelding eruit

  • npm ERR! code EACCES
  • npm error code EACCES
  • npm ERR! Error: EACCES: permission denied, mkdir '/usr/local/lib/node_modules/…'
  • npm error Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
  • Your cache folder contains root-owned files, due to a bug in previous versions of npm which has since been addressed.

Waarom gebeurt dit?

EACCES bij npm betekent dat npm iets wil schrijven in een map waar jouw gebruiker geen schrijfrechten heeft. Meestal gebeurt dat bij npm install -g: globale pakketten gaan naar de prefix-map van npm, en bij een Node.js-installatie via het systeem of een installatiepakket is dat vaak /usr/local of /usr. Die mappen zijn van root.

De voor de hand liggende oplossing, sudo npm install -g, werkt wel, maar maakt het daarna vaak erger. Bestanden en mappen krijgen root als eigenaar, ook in je eigen npm-cache (~/.npm). Bij een volgende installatie zonder sudo krijg je dan opnieuw EACCES, nu op je eigen cache. Daarnaast draaien installatiescripts van pakketten met sudo met volledige rechten op je systeem.

In een project (zonder -g) hoort npm nooit sudo nodig te hebben. Krijg je daar EACCES, dan is node_modules, package-lock.json of de cache meestal eerder met sudo aangemaakt en nu van root.

Zo herken je dit probleem

  • De fout noemt een pad als /usr/local/lib/node_modules of /usr/lib/node_modules: dat is de globale map.
  • De fout noemt ~/.npm of zegt dat de cachemap bestanden van root bevat: eerder is npm met sudo gedraaid.
  • Het gaat om een ander bestand dan npm-mappen, of om een webserver: zie Permission denied: chmod en chown.
  • Faalt de installatie op versieconflicten in plaats van rechten, dan is het ERESOLVE.

Zo los je het op, stap voor stap

Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.

  1. Kijk waar npm globaal installeert

    Vraag de prefix op en controleer wie eigenaar is van die map. Is dat root en draai jij als gewone gebruiker, dan is dat de oorzaak. Kijk ook welke node je gebruikt; staan er meerdere installaties naast elkaar, dan kan dat verwarrend zijn.

    npm config get prefix
    ls -ld "$(npm config get prefix)/lib/node_modules"
    which node npm
  2. Heb je het pakket echt globaal nodig?

    Veel hulpmiddelen hoef je niet globaal te installeren. Met npx start je een pakket eenmalig zonder het globaal te zetten, en als ontwikkelafhankelijkheid in het project heeft iedereen in het team dezelfde versie.

    npx create-vite@latest mijn-app
    npm install --save-dev eslint
    npx eslint .
  3. Installeer Node.js via nvm (aanbevolen)

    Met nvm (Node Version Manager) staat Node.js in je eigen thuismap. Globale pakketten gaan dan ook daarheen en sudo is niet meer nodig. Bovendien kun je per project een andere Node.js-versie gebruiken. Installeer nvm volgens de instructies van het project zelf en open daarna een nieuwe terminal. Voor Windows bestaat een apart project, nvm-windows.

    nvm install --lts
    nvm use --lts
    nvm alias default 'lts/*'
    which node
    npm install -g pakketnaam
  4. Of: geef npm een eigen globale map

    Wil je de bestaande Node.js-installatie houden, laat npm globale pakketten dan in een map in je thuismap zetten. Voeg de bin-map daarvan toe aan je PATH, zodat de commando’s gevonden worden. Gebruik je zsh, zet de regel dan in ~/.zshrc.

    mkdir -p ~/.npm-global
    npm config set prefix ~/.npm-global
    echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.profile
    source ~/.profile
    npm install -g pakketnaam
  5. Herstel de eigenaar van je npm-cache

    Meldt npm dat de cachemap bestanden van root bevat, zet de eigenaar dan terug op jouw gebruiker. Dit is een van de weinige keren dat je sudo nodig hebt, en alleen voor deze ene map.

    sudo chown -R $(id -u):$(id -g) ~/.npm
  6. Herstel node_modules in een project

    Is in het project eerder sudo npm install gedraaid, dan zijn node_modules en soms package-lock.json van root. Zet de eigenaar terug, of verwijder node_modules en installeer opnieuw zonder sudo. Ligt het project op een server onder een andere gebruiker, voer npm dan uit als die gebruiker.

    ls -ld node_modules package-lock.json
    sudo chown -R $(id -u):$(id -g) node_modules package-lock.json
    # of opnieuw installeren:
    sudo rm -rf node_modules
    npm install
  7. Windows: EPERM en EACCES

    Op Windows heet een vergelijkbare fout vaak EPERM. Meestal houdt een ander programma een bestand vast: een open editor, een draaiende ontwikkelserver of een virusscanner. Sluit die programma’s en probeer opnieuw. Start de terminal niet standaard als administrator; dat geeft dezelfde problemen als sudo.

Let op: Gebruik geen sudo voor npm install in een project, en zet nooit chmod 777 op /usr/local of node_modules. Je verschuift het probleem dan, en installatiescripts van pakketten krijgen meer rechten dan nodig.

Waarom sudo npm een slecht idee is

Pakketten op npm kunnen bij installatie scripts uitvoeren. Met sudo draaien die scripts als root, met toegang tot het hele systeem. Daarnaast raken bestanden in je thuismap van root, waardoor latere installaties zonder sudo misgaan.

  • Globale hulpmiddelen: gebruik nvm of een eigen prefix.
  • Eenmalige commando’s: gebruik npx.
  • Projectpakketten: installeer altijd als de gebruiker die eigenaar is van het project.

Wanneer schakel je hulp in?

  • Op de server draaien meerdere Node.js-installaties door elkaar en je weet niet welke wordt gebruikt.
  • Na een sudo-installatie werken npm, de build of de app onder de gewone gebruiker niet meer.
  • Je wilt Node.js op een server zo inrichten dat deploys zonder sudo werken.
  • De fout blijft terugkomen in een gedeelde of beheerde omgeving waar je geen root hebt.

Lukt het niet? Wij helpen

Kom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.

Aanvraag

Hulp aanvragen

Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.

Veelgestelde vragen

Vragen over dit probleem

Waarom krijg ik EACCES bij npm install -g?

npm wil schrijven in een globale map die van root is, zoals /usr/local/lib/node_modules. Installeer Node.js via nvm of stel een eigen prefix in je thuismap in.

Mag ik gewoon sudo gebruiken?

Liever niet. Het werkt eenmalig, maar maakt bestanden van root en laat installatiescripts met volledige rechten draaien. Daarna krijg je vaak nieuwe EACCES-fouten.

Hoe herstel ik een npm-cache met root-bestanden?

Zet de eigenaar terug met sudo chown -R $(id -u):$(id -g) ~/.npm en draai npm daarna weer zonder sudo.

Moet ik Node.js eerst verwijderen om nvm te gebruiken?

Niet per se. Na installatie van nvm komt de versie van nvm eerst in je PATH. Controleer met which node dat je de versie uit je thuismap gebruikt.