Solusi Praktis Cara Mengatasi __Dirname Is Not Defined Node Js

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 .js dibaca sebagai ESM.
  • Ekstensi .mjs selalu dibaca sebagai ESM walau package.json tidak diset.
  • Sintaks import/export menandakan ESM, sedangkan require/module.exports menandakan 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.

  • __dirname berarti folder tempat file aktif berada.
  • __filename berarti path lengkap file aktif.
  • import.meta.url berarti 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:

  1. Import fileURLToPath dari url.
  2. Buat __filename dari import.meta.url.
  3. Buat __dirname memakai path.dirname.
  4. Pakai dengan path.join untuk 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.