Cara mengatasi __dirname is not defined Node.js paling cepat adalah membuat ulang nilainya dari import.meta.url. Error ini muncul karena kamu menjalankan file sebagai ES Module, sedangkan __dirname hanya disediakan otomatis oleh CommonJS.
Kenapa __dirname Hilang di ES Module
Node memuat file dengan dua sistem berbeda. CommonJS memberi __dirname dan __filename secara gratis. ES Module tidak memberi keduanya.
"type": "module"di package.json membuat semua.jsdibaca sebagai ESM.- Ekstensi
.mjsselalu dibaca sebagai ESM walau package.json tidak diset. - Sintaks
import/exportmenandakan ESM, sedangkanrequire/module.exportsmenandakan CommonJS.
| Pesan Error | Penyebab | Konteks Modul |
|---|---|---|
| __dirname is not defined | Variabel CommonJS dipakai di ESM | import, .mjs, type module |
| __filename is not defined | Variabel CommonJS dipakai di ESM | import, .mjs, type module |
| require is not defined | require dipakai di ESM | type module atau .mjs |
Cek Tipe Modul Sebelum Memperbaiki Error
Buka package.json dan lihat field type. Jika nilainya module, file .js milikmu berjalan sebagai ESM. Jika field itu tidak ada, defaultnya CommonJS.
__dirnameberarti folder tempat file aktif berada.__filenameberarti path lengkap file aktif.import.meta.urlberarti URL file aktif dalam ESM dan bahan baku pengganti dua variabel di atas.
Jangan campur require dan import dalam satu file. Campuran itu memicu error lanjutan walau __dirname sudah diperbaiki.
Perbaiki __dirname di ES Module dengan 4 Langkah
Tambahkan tiga baris ini di bagian atas file ESM:
- Import
fileURLToPathdariurl. - Buat
__filenamedariimport.meta.url. - Buat
__dirnamememakaipath.dirname. - Pakai dengan
path.joinuntuk akses file atau folder upload.
import path from "path";
import { fileURLToPath } from "url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const uploadPath = path.join(__dirname, "uploads");
console.log(uploadPath);
Alternatifnya, process.cwd() mengembalikan folder tempat perintah node dijalankan. Cocok untuk path root project, tetapi bisa meleset jika perintah dijalankan dari folder lain.
FAQ
Apakah __dirname bisa dipakai di file .mjs?
Tidak bisa langsung. Buat ulang dengan fileURLToPath(import.meta.url) dan path.dirname().
Apa pengganti __dirname untuk path file upload?
Gunakan path.join(__dirname, "uploads", namaFile) di ESM setelah __dirname dibuat manual.
Kapan tetap pakai CommonJS saja?
Pakai CommonJS jika project lama masih penuh require dan mengubah semuanya ke ESM terlalu berisiko.