Why does Node JS not find a module?

Løs 'Kan ikke finde modul'-fejlen i Node.js

11/01/2024

Rating: 4.31 (11691 votes)

Som Node.js-udvikler har du sandsynligvis oplevet den berygtede "Error: Cannot find module"-fejl. Denne fejl opstår, når Node.js ikke kan finde den fil eller det modul, du forsøger at importere eller kræve i din kode. Det kan være utroligt frustrerende, især når det afbryder din arbejdsgang og bremser udviklingen. Men frygt ikke, for denne fejl er en af de mest almindelige, og heldigvis også en af de mest løsbare. At forstå dens årsager og kende de rigtige trin til at rette den er afgørende for en smidig udviklingsoplevelse. I denne omfattende guide vil vi dykke ned i de forskellige årsager til, at denne fejl opstår, og præsentere en række effektive løsninger, der hjælper dig med at komme tilbage på sporet.

How to fix 'cannot find module' error in NPM?
Try removing the NPM packages installed in your project and reinstalling them again, to fix the “Cannot find module” error. You can do this with the following command sequence: npm cache clear helps to rid the package manager cache of any corrupted module files.

Fejlen "Cannot find module" opstår typisk, når du forsøger at importere et modul ved hjælp af en relativ sti, men Node.js formår ikke at finde det. Dette kan skyldes en række faktorer, herunder forkerte stier, manglende filer eller problemer med modulinstallationen. Node.js adskiller sig fra mange andre sprog som Python eller Java, hvor modulopløsning ofte sker under kodeanalyse før kørsel eller bygning. I Node.js udskydes modulopløsningen, indtil importen faktisk udføres under kørsel eller bundling. Denne forskel er afgørende for at forstå, hvorfor fejlen "Cannot find module" opstår på kørselstidspunktet og ikke under en tidligere fase af din udviklingsproces. Lad os udforske de mest almindelige årsager og de bedste metoder til at løse dem.

Indholdsfortegnelse

Forståelse af 'Kan ikke finde modul'-fejlen

Før vi går i gang med løsningerne, er det vigtigt at have en solid forståelse af, hvad der præcist udløser "Cannot find module"-fejlen. Som nævnt indikerer fejlen, at Node.js ikke kan lokalisere et modul, som din applikation forsøger at indlæse. Dette sker, når Node.js' modulindlæser ikke kan finde den specificerede fil i de stier, den søger igennem. Standardmodulsøgningsrækkefølgen inkluderer indbyggede Node.js-moduler, derefter node_modules-mapper (startende fra den aktuelle mappe og opad) og til sidst stier defineret i NODE_PATH-miljøvariablen. Hvis modulet ikke findes i nogen af disse placeringer, udløses fejlen.

Forestil dig, at du har en linje som const app = require('./app');. Hvis app.js ikke findes i den forventede relative sti, vil du se fejlen. Dette kan være et symptom på flere underliggende problemer, som vi vil dække i detaljer nedenfor.

Almindelige årsager og løsninger

1. Forkert filsti

En af de mest hyppige årsager til "Cannot find module"-fejlen er en simpelthen forkert filsti. Det er let at lave en lille fejl i en relativ sti, især når dit projekt vokser i størrelse og kompleksitet. Dobbelttjek din importsti. Sørg for, at filen eksisterer på den angivne placering. Husk, at relative stier (f.eks. ./ for den nuværende mappe, ../ for den overordnede mappe) er baseret på placeringen af den fil, der foretager require()-kaldet. Hvis du er i tvivl, eller hvis du har en dyb mappestruktur, kan det være mere robust at bruge absolutte stier.

Eksempel på forkert sti:

// Forkert sti (filen eksisterer ikke)
const config = require('../config'); // Fejl

Eksempel på korrekt sti:

// Korrekt sti (filen eksisterer)
const config = require('./config'); // Virker

For at skabe absolutte stier kan du bruge path.resolve()-metoden fra Node.js' indbyggede path-modul. Dette kan reducere problemer med relative stier betydeligt, da den returnerede sti altid er absolut og ikke afhænger af den aktuelle arbejdsmappe.

const path = require('path');
const app = require(path.resolve(__dirname, 'app.js'));

__dirname er en global variabel i Node.js, der indeholder den absolutte sti til den mappe, hvor den nuværende udførte fil er placeret. Dette er et utroligt nyttigt værktøj til at bygge robuste stier, der fungerer uanset hvorfra dit script kaldes.

How do I fix a module error in Node JS?
In this command, replace module-name with the actual name of the module you’re trying to use. After running this command, Node.js should be able to locate the module, and the error should be resolved. Always check your package.json file to confirm that the module is listed under dependencies after installation.

2. Manglende filendelse

Selvom Node.js ofte kan gætte filendelsen (f.eks. .js eller .json), især for moduler i node_modules, kan det i nogle tilfælde være nødvendigt at angive den eksplicit. Dette gælder især, hvis du importerer lokale filer, der ikke er JavaScript-filer (f.eks. JSON-konfigurationsfiler) eller hvis du har konfigureret din byggesystem til at håndtere andre filtyper. For klarhedens skyld og for at undgå potentielle problemer er det god praksis at inkludere filendelsen, især for lokale moduler.

// Uden endelse (kan fejle)
const routes = require('./routes/index');
// Med endelse (mere pålidelig)
const routes = require('./routes/index.js');

3. Problemer med store/små bogstaver (Case Sensitivity)

Dette er en klassisk fælde, især for udviklere, der arbejder på tværs af forskellige operativsystemer. Filhåndteringssystemer på Linux og macOS er store/små bogstaver-følsomme (case-sensitive), mens Windows' filhåndteringssystemer typisk ikke er det (case-insensitive). Det betyder, at myFile.js og myfile.js betragtes som to forskellige filer på Linux/macOS, men som den samme fil på Windows. Hvis du udvikler på Windows og flytter dit projekt til et Linux-baseret miljø (f.eks. en server), kan du pludselig opleve "Cannot find module"-fejl på grund af dette. Sørg altid for, at din importsti matcher den nøjagtige filnavns-kapsling.

// Forkert store/små bogstaver (kan fejle på Linux/macOS)
const someFile = require('../../someFile');
// Korrekt store/små bogstaver
const someFile = require('../../SomeFile');

4. Modulet er ikke installeret

Hvis du forsøger at bruge et tredjepartsmodul (som puppeteer, lodash, pg eller mysql2), og det ikke er korrekt installeret i dit projekt, vil Node.js naturligvis ikke kunne finde det. Dette er en af de mest ligetil årsager til fejlen. Det første skridt er altid at sikre, at modulet er korrekt installeret.

Lokal installation (Anbefalet):

Den mest almindelige og anbefalede metode er at installere modulet lokalt i dit projekt. Dette sikrer, at dit projekt har sine egne afhængigheder, isoleret fra andre projekter, og undgår konflikter. Brug kommandoen npm install <modul_navn> i din projekts terminal. Dette installerer modulet og dets afhængigheder i din projekts node_modules-mappe.

npm install puppeteer

Efter installationen bør modulet være anført under dependencies eller devDependencies i din package.json-fil.

Global installation (Brug med forsigtighed):

Hvis du har brug for modulet tilgængeligt på tværs af flere projekter (f.eks. CLI-værktøjer), kan du bruge npm install -g <modul_navn>. Vær dog forsigtig. Globale installationer kan rode dit system til og gøre afhængighedsstyring mere kompleks, da forskellige projekter kan kræve forskellige versioner af det samme modul. Generelt bør du undgå globale installationer til projekt-specifikke afhængigheder.

Why does node have a'module not found' error?
The source of Node‘s runtime "module not found" errors contrasts with how other languages handle dependencies: For example, Python and Java imports fail fast during code analysis before runtime or building. But Node defers module resolution until executing imports while running or bundling.
npm install -g ts-node

5. Korrupt node_modules-mappe eller npm cache

Nogle gange kan installationsprocessen blive forstyrret, hvilket resulterer i en korrupt node_modules-mappe eller en beskadiget npm-cache. Dette kan føre til, at Node.js ikke kan finde moduler, selvom de ser ud til at være installeret. Denne løsning er ofte en 'sidste udvej', når andre metoder fejler.

Trin til geninstallation af moduler:

  1. Slet node_modules-mappen og package-lock.json-filen (eller yarn.lock/pnpm-lock.yaml afhængigt af din pakkehåndtering).

    rm -rf node_modules
    rm -f package-lock.json
  2. Rens npm-cachen for at fjerne eventuelle beskadigede modulfiler.

    npm cache clean --force
  3. Kør npm install igen for at geninstallere alle afhængigheder, der er anført i din package.json-fil.

    npm install

Denne proces sikrer en frisk installation af alle dine projektets afhængigheder og løser ofte underliggende problemer, der forårsager "Cannot find module"-fejlen.

6. Tastefejl i modulnavnet

En enkel, men overraskende almindelig årsag er en stavefejl i modulnavnet, når du forsøger at importere det. Det er let at overse en lille fejl, især i store kodebaser. Sørg altid for, at modulnavnet i din require()- eller import-sætning nøjagtigt matcher det installerede modulnavn (og husk på store/små bogstaver).

const myModule = require('myModul'); // Tastefejl her

I dette tilfælde skulle det korrekte modulnavn have været myModule. Dobbelttjek altid din stavning.

Why does Node JS not find a module?
This error occurs when Node.js cannot locate the required file or module. Let's explore how to fix it. The error appears when you try to import a module using a relative path, but Node.js fails to find it. Common causes include incorrect paths, missing files, or module installation issues.

7. TypeScript-specifikke problemer (Type Definitioner)

Hvis du arbejder med TypeScript, kan "MODULE_NOT_FOUND"-fejlen opstå, når du importerer en pakke, der ikke har nogen detekterede type definitioner. TypeScript har brug for disse definitioner for at forstå strukturen af JavaScript-moduler under kompilering. Hvis du importerer et indbygget Node.js-modul som http eller fs, skal du muligvis tilføje "node" til compilerOptions.types i din tsconfig.json-fil:

{
 "compilerOptions": {
 "types": [
 "node"
 ]
 }
}

For tredjepartsmoduler skal du installere type definitionerne fra npm. De er typisk navngivet med et @types/ præfiks:

npm install @types/express

8. package.jsonmain-felt eksisterer ikke eller er forkert

Når du require() et modul uden at specificere en filsti (f.eks. require('my-module')), vil Node.js lede efter en package.json-fil i modulets rodmappe. Denne package.json-fil kan indeholde et main-felt, der angiver startfilen for modulet. Hvis dette felt mangler, eller peger på en fil, der ikke eksisterer, kan Node.js ikke finde modulets indgangspunkt og vil kaste en "Cannot find module"-fejl.

Sørg for, at main-feltet i modulets package.json-fil (eller din egen, hvis du bygger et modul) peger på den korrekte indgangsfil, typisk index.js eller main.js.

9. Brug af npm link til lokal udvikling

Hvis du udvikler et modul lokalt og ønsker at bruge det i et andet lokalt projekt uden at udgive det til npm-registret, kan npm link være utrolig nyttig. Denne kommando opretter et symbolsk link mellem et globalt installeret modul og et lokalt projekt. Hvis du har problemer med at et lokalt udviklet modul ikke kan findes, kan npm link være løsningen.

Sådan bruges det:

  1. Naviger til rodmappen for det modul, du udvikler (f.eks. cd ../faye).

  2. Kør npm link. Dette opretter et symbolsk link i din globale node_modules-mappe, der peger på dit lokale modul.

  3. Naviger til rodmappen for dit projekt, hvor du vil bruge modulet (f.eks. cd /home/dave/src/server).

    Why am I getting a Node JS error?
    These errors typically arise when Node.js cannot locate a module you're trying to use in your code. In your Node.js project, you encounter a JavaScript dependency. Upon attempting to import an item from the dependency module, you receive the following Node.js error.
  4. Kør npm link <modul_navn> (f.eks. npm link faye).

Dette forbinder den globale pakke med dit lokale projekt og giver dig mulighed for at teste ændringer i modulet med det samme, uden at skulle geninstallere eller udgive det.

10. Miljøvariablen NODE_PATH (Avanceret/ældre)

I ældre Node.js-versioner kunne "Cannot find module"-fejlen nogle gange løses ved at indstille NODE_PATH-miljøvariablen til den korrekte node_modules-installationsmappe. NODE_PATH er en streng af absolutte stier adskilt af kolonner (på Unix-lignende systemer) eller semikolonner (på Windows), som Node.js bruger til at lokalisere moduler, når de ikke kan findes andre steder.

Selvom det stadig understøttes, er det ikke længere den primære eller anbefalede metode til modulopløsning i de fleste moderne Node.js-projekter. Den etablerede konvention for at finde afhængige moduler i Node.js-fællesskabet (via node_modules-mappen) er langt mere robust og forudsigelig. Brug af NODE_PATH kan føre til uforudsete problemer og gøre dit projekt mindre bærbart. Det er bedst at fokusere på de andre løsninger, der involverer korrekt sti- og pakkehåndtering.

Fejlsøgnings-tips

Når du står over for "Cannot find module"-fejlen, kan et par simple fejlsøgningsteknikker hjælpe dig med at isolere problemet:

  • Tjek den aktuelle mappe: Brug console.log(__dirname) i din fil for at se den absolutte sti til den mappe, hvor den aktuelle fil er placeret. Dette kan hjælpe dig med at dobbelttjekke, om dine relative stier er korrekte i forhold til din fil.

  • Bekræft filens eksistens: Brug fs.existsSync() fra Node.js' indbyggede fs-modul til at verificere, om en fil faktisk eksisterer på den sti, du forventer. For eksempel: console.log('Fil eksisterer:', fs.existsSync('./app.js'));

Disse enkle trin kan give dig værdifuld indsigt i, hvorfor Node.js ikke kan finde dit modul.

Can't find module X in NodeJS?
For TypeScript users, if you are importing a built-in Node module (such as http, path or url) and you are getting an error such as "Cannot find module "x" then the error can be fixed by running The command will import the NodeJS TypeScript definitions into your project, allowing you to use Node's built-in modules.

Konklusion

Fejlen "Cannot find module" er en almindelig udfordring for Node.js-udviklere, men som vi har set, er den absolut løsbar. Ved systematisk at gennemgå de potentielle årsager – fra at dobbelttjekke filstier og filendelser, over at sikre korrekt store/små bogstaver, til at bekræfte modulinstallationer og rense npm-cachen – kan du effektivt diagnosticere og rette problemet. Husk altid at starte med de mest ligetil løsninger og arbejde dig op til de mere komplekse. En solid forståelse af Node.js' modulopløsningsmekanismer er nøglen til at mestre denne fejl og sikre, at dine Node.js-applikationer kører problemfrit. Med disse metoder i din værktøjskasse er du godt rustet til at håndtere enhver modulrelateret fejl, der måtte komme din vej.

Ofte stillede spørgsmål (FAQ)

Hvad forårsager 'Cannot find module'-fejlen i Node.js?

Fejlen opstår typisk, når Node.js ikke kan lokalisere et modul på grund af forkerte filstier, manglende modulinstallationer, tastefejl i modulnavne, problemer med node_modules-mappen eller korrupt npm-cache.

Hvordan tjekker jeg, om et modul er installeret?

Du kan tjekke din package.json-fil for at se, om modulet er anført under dependencies eller devDependencies. Alternativt kan du køre npm list <modul_navn> i din terminal for at se, om det specifikke modul er installeret.

Kan jeg bruge relative stier til moduler?

Ja, du kan bruge relative stier (f.eks. ./myModule eller ../utils/helper) når du importerer moduler. Det er dog afgørende, at stien er korrekt og matcher filstrukturen i dit projekt fra den fil, der foretager importen.

Hvad skal jeg gøre, hvis min npm-cache er korrupt?

Hvis din npm-cache mistænkes for at være korrupt, kan du rydde den ved at køre kommandoen npm cache clean --force. Efterfølgende bør du geninstallere dine moduler med npm install for at sikre en frisk installation.

Er 'Cannot find module'-fejlen følsom over for store/små bogstaver?

Ja, filstier er følsomme over for store/små bogstaver på mange operativsystemer (som Linux og macOS), så du skal sørge for at bruge den korrekte kapsling, når du refererer til modulnavne og filstier. På Windows er filsystemet typisk ikke følsomt over for store/små bogstaver, men det er god praksis at overholde den korrekte kapsling for at sikre kompatibilitet på tværs af platforme.

Hvis du vil læse andre artikler, der ligner Løs 'Kan ikke finde modul'-fejlen i Node.js, kan du besøge kategorien Teknologi.

Go up