Node.js REPL (Read-Eval-Print Loop), terminalde argümansız node yazdığınızda açılan etkileşimli ortamdır: yazdığınız satırı okur, değerlendirir, sonucu yazdırır ve bir sonraki girişi bekler. Küçük bir kod parçasını denemek, bir API'nin ne döndürdüğüne bakmak ya da bir hatayı hızlıca yeniden üretmek için en kısa yoldur. Çıkmak için .exit yazabilir ya da Ctrl+D tuşlarına basabilirsiniz.
Bu yazıda REPL'in nokta komutlarını (.help, .editor, .save, .load), son sonucu tutan _ değişkenini, üst düzey await desteğini, kalıcı geçmişi ve ortam değişkenleriyle ayarlarını ele alıyoruz. Ardından node:repl modülüyle kendi REPL'inizi kurup özel komut ve özel değerlendirme fonksiyonu eklemeyi gösteriyoruz.
REPL'i başlatmak ve ilk ifadeler
node komutunu betik ya da argüman vermeden çalıştırdığınızda REPL başlar. -i (--interactive) bayrağı ise standart girdi bir terminal gibi görünmese bile REPL'i açar. Aşağıdaki çıktıları, girişleri bir dosyadan node -i'ye yönlendirerek aldık; terminal olmadığı için girdiğimiz satırlar ekranda yinelenmiyor, yalnızca sonuçlar görünüyor:
NODE_REPL_HISTORY=' ' node -i < girdi.txt
# çıktı: Welcome to Node.js v26.13.0.
# çıktı: Type ".help" for more information.
# çıktı: > undefined
# çıktı: > [ 10, 20, 30 ]
# çıktı: > 30
# çıktı: > '.pdf'// girdi.txt içeriği (her satır bir REPL girişi)
const sayilar = [1, 2, 3]
sayilar.map((x) => x * 10)
_[2]
path.extname('rapor.pdf')İlk satır bir değişken bildirimidir ve REPL onun değeri olarak undefined yazar. İkinci satır bir ifadedir ve sonucu doğrudan görünür. Learn rehberi bu farkı şöyle açıklar: console.log() gibi bir çağrıdan sonra gördüğünüz undefined, o fonksiyonun dönüş değeridir. Dördüncü satırda path modülünü içe aktarmadan kullandık: varsayılan değerlendirici, yerleşik modülleri ilk kullanıldıkları anda yükler. Belgeye göre fs yazdığınızda, aynı adla tanımlı bir değişken yoksa bu global.fs = require('node:fs') olarak değerlendirilir.
Blok kapsamı dışında const, let veya var ile bildirilen değişkenler REPL'de global kapsamda tanımlanır. Bu yüzden bir satırda tanımladığınız değişkeni sonraki satırlarda kullanabilirsiniz. Aynı adı const ile ikinci kez bildirmeye çalışırsanız SyntaxError: Identifier has already been declared türünde bir hata alırsınız; denemeler arasında temiz bir sayfa istiyorsanız yeni bir oturum açmak en kolay yoldur.
Nokta komutları

Nokta ile başlayan özel komutlar her REPL örneğinde bulunur. .help güncel listeyi gösterir. Belgede tanımlanan komutlar şunlardır:
| Komut | Ne yapar |
|---|---|
| .break | Çok satırlı bir girişi yarıda keser (Ctrl+C ile aynı) |
| .clear | REPL bağlamını boş bir nesneye sıfırlar, çok satırlı girişi temizler |
| .exit | Giriş-çıkış akışını kapatır ve REPL sonlanır |
| .help | Özel komutların listesini gösterir |
| .save dosya | Oturumdaki komutları dosyaya kaydeder |
| .load dosya | Bir dosyayı geçerli oturuma yükler |
| .editor | Editör moduna geçer (Ctrl+D ile bitir, Ctrl+C ile iptal) |
.editor özellikle birden çok satırlık bir fonksiyonu tek seferde yapıştırmak için kullanışlıdır: modu açarsınız, kodu yazar veya yapıştırırsınız, Ctrl+D ile bitirdiğinizde hepsi birlikte değerlendirilir. Girişler bir dosyadan geldiğinde terminal özellikleri devre dışı kaldığı için bizim denememizde .help listesinde .editor görünmedi ve .clear "Alias for .break" olarak listelendi; tam liste etkileşimli bir terminalde açılan REPL'de görünür.
.save ile oturumu bir dosyaya yazıp sonra .load ile geri yükleyebilirsiniz. Bu, REPL'de denediğiniz bir fikri betiğe dönüştürmenin hızlı bir yoludur; ancak kaydedilen dosyada hata veren satırlar da bulunabileceğinden onu doğrudan çalıştırmadan önce gözden geçirin. .load yolu geçerli çalışma klasörüne göre çözer.
Tuş kısayolları
- Ctrl+C: Bir kez basınca
.breakgibi çalışır; boş satırda iki kez basınca REPL'den çıkar. - Ctrl+D:
.exitile aynı etkiyi yapar. - Tab: Boş satırda global ve yerel değişkenleri, yazarken ilgili tamamlama seçeneklerini gösterir.
- Ctrl+R ve Ctrl+S: Geçmişte geriye ve ileriye doğru arama yapar (reverse-i-search); Esc ile iptal edilir.
- Yukarı ok: Bu ve önceki oturumlardaki satırlara erişim sağlar.
Çok satırlı giriş
REPL, girdiğiniz satırın tamamlanmadığını kendisi anlar. Bir süslü parantez açıp Enter'a bastığınızda çok satırlı moda geçer ve girişi bloğu kapatana kadar bekler. Belgeye göre v24.0.0 ile çok satırlı girişin göstergesi ... yerine | oldu ve çok satırlı geçmiş desteği geldi; artık sözdizimi hatası olan çok satırlı bir komutu geçmişte bulup düzenleyebilirsiniz. Eski Learn sayfasında gördüğünüz üç nokta bu yüzden güncel sürümde | olarak görünür.
// girdi.txt devamı
let s = 0
for (const x of sayilar) {
s += x
}
// çıktı: > undefined
// çıktı: > | | 6Çıktıdaki iki |, döngünün devam satırları için gösterilen istemlerdir; blok kapandığında son ifadenin değeri olan 6 yazıldı. Çok satırlı bir girişi yarıda bırakmak isterseniz .break yazın ya da Ctrl+C'ye basın; o ana kadar yazılan kod çalıştırılmaz.
_ ve _error değişkenleri

Varsayılan değerlendirici, en son değerlendirilen ifadenin sonucunu _ değişkenine atar. Yukarıdaki örnekte _[2] yazınca bir önceki sonucun, yani [ 10, 20, 30 ] dizisinin üçüncü elemanını aldık. Belgeye göre _ değişkenine kendiniz bir değer atarsanız bu davranış kapanır ve REPL bunu bir mesajla bildirir:
> [ 'a', 'b', 'c' ]
[ 'a', 'b', 'c' ]
> _.length
3
> _ += 1
Expression assignment to _ now disabled.
4
> 1 + 1
2
> _
4Bu çıktıyı da kendi denememizde aldık; atamadan sonra 1 + 1 sonucu _ değişkenine yazılmadı ve değer 4 olarak kaldı. Benzer şekilde _error son görülen hatayı tutar: throw new Error('foo') çalıştırıp ardından _error.message yazdığınızda 'foo' görürsünüz. Kendiniz _error'a değer atarsanız bu davranış da kapanır.
Üst düzey await
REPL'de await anahtar kelimesi bir fonksiyonun içine yazmadan doğrudan kullanılabilir. Bu, bir Promise döndüren API'yi denemek için çok pratiktir. Promise'in kendisi ve async/await dil kuralları için async/await yazısına bakın.
printf "await Promise.resolve(123)\n" | NODE_REPL_HISTORY=' ' node -i
# çıktı: Welcome to Node.js v26.13.0.
# çıktı: Type ".help" for more information.
# çıktı: > 123Belgede bilinen bir sınırlama da anlatılır: REPL'de await kullanımı const bildirimlerinin sözcüksel kapsamını bozar. const m = await Promise.resolve(123) yazdıktan sonra m'ye yeni bir değer atayabildiğinizi görürsünüz, ama aynı adı yeniden const ile bildirmek yine hata verir. Bu özelliği kapatmak için --no-experimental-repl-await bayrağı vardır.
Hata yönetimi
REPL'de yakalanmamış bir hata oturumu sonlandırmaz; hata çıktıya Uncaught Error: ... biçiminde yazılır ve REPL yeni girişi bekler. Belgeye göre REPL, oturumdaki yakalanmamış istisnaları domain modülüyle yakalar. Bunun bir yan etkisi vardır: başka bir programın içinde açılmış bir REPL'de uncaughtException dinleyicisi eklemeye çalışmak ERR_INVALID_REPL_INPUT hatası üretir; bu dinleyici yalnızca bağımsız REPL'de çalışır. repl.start() fonksiyonunun v25.9.0 ile eklenen handleError seçeneği hatanın yazdırılmasını ('print'), yok sayılmasını ('ignore') ya da sürecin genel hata işleyicilerine iletilmesini ('unhandled') seçmenizi sağlar.
Geçmiş ve ortam değişkenleri

Node.js REPL'i varsayılan olarak girişleri kullanıcının ev klasöründeki .node_repl_history dosyasına kaydeder ve sonraki oturumlarda yukarı ok tuşuyla bunlara ulaşabilirsiniz. Davranışı şu ortam değişkenleriyle değiştirebilirsiniz:
| Değişken | Etkisi | Varsayılan |
|---|---|---|
| NODE_REPL_HISTORY | Geçmiş dosyasının yolu; boş metin geçmişi kapatır | ~/.node_repl_history |
| NODE_REPL_HISTORY_SIZE | Saklanacak geçmiş satırı sayısı (pozitif sayı) | 1000 |
| NODE_REPL_MODE | sloppy ya da strict değerlendirme modu | sloppy |
| NODE_NO_READLINE | 1 ise kanonik terminal ayarları (rlwrap ile kullanım için) | tanımsız |
| NODE_DISABLE_COLORS | Tanımlıysa REPL renk kullanmaz | tanımsız |
Windows'ta değeri boş olan ortam değişkenleri geçersiz sayılır. Belge, bu yüzden Windows'ta geçmişi kapatmak için NODE_REPL_HISTORY değişkenine bir veya daha fazla boşluk atamayı önerir; değerdeki boşluklar zaten kırpılır. Bizim örneklerimizde de geçmiş dosyasını kirletmemek için NODE_REPL_HISTORY=' ' kullandık. Ortam değişkenlerinin genel kullanımı için process.env ve --env-file yazısına bakın.
Çıktı biçimini oturum içinden de ayarlayabilirsiniz. Bağımsız REPL'de util.inspect.replDefaults özelliği util.inspect() varsayılanlarının bir yansımasıdır; örneğin util.inspect.replDefaults.compact = false yazdıktan sonra diziler her eleman ayrı satırda olacak biçimde gösterilir. util.inspect seçeneklerinin tamamı util.promisify ve inspect yazısında.
node:repl ile kendi REPL'inizi kurmak
Node.js kendi etkileşimli arayüzünü node:repl modülüyle sağlar ve aynı modülü siz de kullanabilirsiniz. repl.start() bir REPLServer örneği döndürür; bu sınıf readline.Interface sınıfını genişletir. Giriş ve çıkış varsayılan olarak process.stdin ve process.stdout'tur ama herhangi bir Node.js akışına bağlanabilir. Aşağıdaki örnekte girişi bir PassThrough akışından verdik ki betik kendi kendine çalışıp bitsin:
import repl from 'node:repl';
import { PassThrough } from 'node:stream';
const input = new PassThrough();
const r = repl.start({ prompt: 'kdl> ', input, output: process.stdout, terminal: false });
r.context.kdv = 0.2;
r.defineCommand('selam', {
help: 'Selam verir',
action(ad) {
this.clearBufferedCommand();
console.log(`Merhaba, ${ad}!`);
this.displayPrompt();
},
});
r.on('exit', () => console.log('REPL kapandı'));
input.write('100 * kdv\n');
input.write('.selam Ayşe\n');
input.write('kdv = 0.1\n');
input.end();
// çıktı: kdl> 20
// çıktı: kdl> Merhaba, Ayşe!
// çıktı: kdl> 0.1
// çıktı: kdl> REPL kapandır.context nesnesine eklediğiniz özellikler REPL içinde yerel değişken gibi görünür. Belgeye göre bu özellikler varsayılan olarak salt okunur değildir; örnekte kdv = 0.1 ataması da bu yüzden çalıştı. Değiştirilmesini istemediğiniz bir değeri Object.defineProperty() ile configurable: false vererek tanımlayabilirsiniz. defineCommand() ile eklenen komutlar nokta ile çağrılır; help metni .help listesinde görünür. Giriş akışı bittiğinde 'exit' olayı tetiklendi. Bağlamı .clear sonrasında yeniden kurmak isterseniz 'reset' olayını dinleyebilirsiniz.
Programatik olarak açılan REPL'de geçmiş dosyası kendiliğinden başlatılmaz; bunun için replServer.setupHistory() metodunu çağırmanız gerekir. Yerleşik modül listesini veren repl.builtinModules ise kullanımdan kaldırılmıştır (Stability 0); yerine module.builtinModules kullanılır.
Özel değerlendirme fonksiyonu
eval seçeneğiyle girişlerin nasıl değerlendirileceğini tamamen kendiniz belirleyebilirsiniz. Fonksiyon dört argüman alır: kod metni, bağlam, kaynak adı ve geri çağırma fonksiyonu. Geri çağırmaya ilk argüman olarak bir hata ya da null, ikinci argüman olarak sonucu verirsiniz. Aşağıdaki örnek, belgedeki kare alma örneğinin Türkçe bir uyarlamasıdır:
import repl from 'node:repl';
import { PassThrough } from 'node:stream';
function kareEval(code, context, file, callback) {
const n = Number(code);
if (Number.isNaN(n)) callback(new Error(`${code.trim()} bir sayı değil`));
else callback(null, n * n);
}
const input = new PassThrough();
repl.start({ prompt: '? ', input, output: process.stdout, terminal: false, eval: kareEval });
input.end('7\nabc\n');
// çıktı: ? 49
// çıktı: ? Uncaught Error: abc bir sayı değil
// çıktı: at kareEval (file:///home/kullanici/proje/hesap.mjs:6:33)
// çıktı: ... (yığın kısaltıldı)Çok satırlı girişi desteklemek isterseniz eksik girişlerde geri çağırmaya new repl.Recoverable(hata) verebilirsiniz; REPL bu durumda ek satır ister. Çıktının biçimini değiştirmek için de writer seçeneğine bir fonksiyon verirsiniz; varsayılan yazıcı util.inspect()'tir.
Sık yapılan hatalar
- REPL sonucunu betik çıktısı sanmak: REPL her ifadenin değerini kendiliğinden yazar; aynı kod bir dosyada çalıştığında yalnızca
console.logile yazdırdıklarınız görünür. - Yerleşik modüllerin dosyada da otomatik geldiğini sanmak:
fsveyapath'i içe aktarmadan kullanmak REPL'e (ve-e/-p'ye) özgüdür; dosyadaimportgerekir. - _ değişkenine yanlışlıkla atama yapmak: Bir kez atadığınızda otomatik son sonuç davranışı oturum boyunca kapanır.
- Geçmiş dosyasına gizli bilgi yazmak: REPL'e yapıştırdığınız anahtar ve parolalar
.node_repl_historydosyasına kaydedilir. Gerekirse geçmişiNODE_REPL_HISTORYile kapatın. - Gömülü REPL'de uncaughtException dinlemek: Başka bir programın içinde açılan REPL'de bu dinleyici
ERR_INVALID_REPL_INPUTverir; hata davranışı içinhandleErrorseçeneğini kullanın.
Sık Sorulan Sorular
REPL'den nasıl çıkarım?
.exit yazın, Ctrl+D'ye basın ya da boş satırda Ctrl+C'ye iki kez basın.
REPL'i strict modda çalıştırabilir miyim?
Evet. Komut satırı REPL'inde NODE_REPL_MODE=strict ortam değişkenini kullanın; programatik REPL'de replMode: repl.REPL_MODE_STRICT seçeneğini verin. Belgeye göre bu, her girişin başına 'use strict' yazmakla eşdeğerdir. Strict modun dil düzeyindeki etkileri için strict mode yazısına bakın.
REPL'de ES modülü import edebilir miyim?
REPL --input-type seçeneğini desteklemez. Dinamik import() ifadesi ve üst düzey await ile bir modülü yükleyebilirsiniz; örneğin const m = await import('node:path').
Hata ayıklama için REPL yeterli mi?
Küçük denemeler için evet. Kesme noktası koymak ve adım adım ilerlemek için --inspect ve DevTools yazısındaki araçları kullanın.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: Node.js öğrenme rehberi · Betik çalıştırma · util.inspect · readline ile kullanıcı girdisi · Debug ve DevTools · async/await