__dirname ist kein definierter Fehler in der Node 14-Version [duplicate]

Lesezeit: 4 Minuten

Eduards Benutzeravatar
Eduard

Ich habe die Node-Version verwendet 12.3.4 aktualisierte es auf 14.14.0 und fing an, viele Probleme zu erhalten, die ich behoben habe. Das einzige, was ich nicht verstehe, ist das Problem

__dirname is not defined

__dirname ist eine Kernvariable in Node, wie ich weiß. Wird sie in Node 14 entfernt?

  • Ist das in MJS oder CJS? Im MJS-Modus benötigen Sie einen Shim, da es mit anders funktioniert import.

    – Tadman

    16. Oktober 2020 um 6:23 Uhr


  • Dokumentation

    – Jaromanda X

    16. Oktober 2020 um 6:27 Uhr

Wie lädst du die Datei? Gemäß diesem Problem tritt das Problem auf, wenn Sie es als ECMAScript-Modul laden, das __dirname nicht enthält.

https://github.com/nodejs/help/issues/2907#issuecomment-671782092

Wenn Sie die folgende Dokumentation befolgen, können Sie das Problem möglicherweise lösen:
https://nodejs.org/api/esm.html#esm_no_require_exports_module_exports_filename_dirname

import { fileURLToPath } from 'url';
import { dirname } from 'path';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

  • Gute Antwort. Arbeitete wie Charme.

    – raj240

    9. Dezember 2021 um 10:04 Uhr

  • Ich bekam “dirname is not defined”, also musste ich in die letzte Zeile wechseln const __dirname = path.dirname(__filename);

    – 6 Byte

    28. Februar 2022 um 22:22 Uhr

  • Dies entspricht “offiziellen” Ratschlägen github.com/nodejs/help/issues/2907#issuecomment-757446568

    – Beni Cherniavsky-Paskin

    28. März 2022 um 18:37 Uhr

  • Vielen Dank. Ich war dabei hängengeblieben. Ich habe auf es6 neu formatiert und mein ‘Pfad’-Import ist kaputt gegangen. Code davor war so etwas wie res.status(200).sendFile(path.join(__dirname, ‘/public/main.js’)). Ich habe die von Ihnen empfohlenen Importe verwendet und in res.status(200).sendFile(__dirname + ‘/public/main.js’) geändert. Nochmals danke, danke.

    – Tim Sonner

    26. September 2022 um 11:26 Uhr


Benutzeravatar von Jiyoon Hur
Jiyoon Hur

Mein Code vorher war wie unten.

app.use(express.static(path.join(__dirname, 'public')));

Und ich habe diesen Fehler.

ReferenceError: __dirname ist nicht im Geltungsbereich des ES-Moduls definiert

Und ich habe das gelöst, indem ich unten Code hinzugefügt habe.

import path from 'path';
const __dirname = path.resolve();

  • Dies löst nur die cwd des Node-Prozesses auf, also zB node myscript.mjs wird aber funktionieren node dir/myscript.mjs wird nicht.

    – Dan

    10. September 2021 um 22:13 Uhr

  • Dieser hat mein Problem gelöst.

    – Nilay Singh

    5. April 2022 um 8:16 Uhr

  • Ich habe eigentlich versucht zu reparieren path.resolve(__dirname, "foo", "bar")weil mir nicht klar war, dass es den Pfad sowieso relativ machen wird, wenn Sie ihm nur Pfadsegmente übergeben – Sie können einfach weglassen __dirname. Danke!

    – Kodierer

    18. Juli 2022 um 14:24 Uhr

Es besteht normalerweise keine Notwendigkeit, aus „url“ oder „path“ zu importieren.

ZB (mit ESM)

fs.readFileSync(new URL('myfile.txt', import.meta.url));

liest myfile.txt aus dem Verzeichnis der JavaScript-Datei (nicht aus dem aktuellen Arbeitsverzeichnis).

  • Coole Lösung, aber für diejenigen, die sich nicht auskennen und/oder nicht in einem Browserkontext arbeiten, in dem die Verwendung von URLs etwas fehl am Platz erscheint, nicht sehr klar. Vielleicht könnten Sie darauf eingehen, wann dies besonders angebracht ist?

    – Dan

    10. September 2021 um 22:03 Uhr

  • Ok, sieht so aus, als müsste ich nur meine Gedanken aktualisieren. path.resolve() gibt nur cwd zurück. Andere Methoden sind langatmig. Das URL-Konzept ist in ES6-Module integriert. Es scheint, dass dies jetzt der Standardansatz ist stackoverflow.com/a/66651120/4682556. Danke für diese Antwort!

    – Dan

    10. September 2021 um 22:11 Uhr


  • Dies gibt a zurück Bufferwenn Sie eine Zeichenfolge verwenden möchten: fs.readFileSync(new URL('myfile.txt', import.meta.url), 'utf-8');

    – Michael Stramel

    6. Oktober 2021 um 22:27 Uhr


  • Das ist großartig, danke! Keine zusätzlichen Anforderungen, keine Hacks, zukunftssicher.

    – Tomáš Kafka

    19. November 2021 um 15:45 Uhr

  • @Dan Ja, eine URL wird ihrem Namen immer mehr gerecht: einheitlicher Ressourcen-Locator. Es ist nicht unbedingt auf eine Ressource im Web beschränkt.

    – Константин Ван

    10. Dezember 2022 um 4:26 Uhr

Eine schnelle Lösung (abhängig von Ihrem Projekt) wäre, dies sicherzustellen "type": "module" gibt es bei dir nicht package.json Datei

Benutzeravatar von PUGAZHARASAN
PUGAZHARASAN

Habe das über den obigen Link

import express from 'express';
import path from 'path';
import { fileURLToPath } from 'url';

const app = express();

//we need to change up how __dirname is used for ES6 purposes
const __dirname = path.dirname(fileURLToPath(import.meta.url));
//now please load my static html and css files for my express app, from my /dist directory
app.use(express.static(path.join(__dirname ,'dist')));

//works...

1442040cookie-check__dirname ist kein definierter Fehler in der Node 14-Version [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy