2026'da Node.js 24: URLPattern, Yetki Modeli ve Mülakat Soruları

Node.js 24 LTS, kararlı bir Yetki Modeli, global URLPattern, using/await using ile açık kaynak yönetimi ve V8 13.6 sunuyor. Üretim ortamları ve mülakatlar için önemli olan özelliklerin derinlemesine incelemesi.

Node.js 24 URLPattern, yetki modeli ve mülakat hazırlık rehberi

Node.js 24, Krypton kod adıyla Ekim 2025'te LTS statüsüne ulaştı ve 2026'da önerilen üretim sürümü olmaya devam ediyor. Bu sürüm Yetki Modeli'ni (Permission Model) kararlı hale getiriyor, URLPattern'i global bir API olarak sunuyor, V8 13.6 aracılığıyla açık kaynak yönetimi sağlıyor ve npm'i 11. sürüme güncelliyor. Bu değişiklikler, backend uygulamalarının güvenlik, yönlendirme ve kaynak yaşam döngüsü konularını ele alış biçimini doğrudan etkiliyor.

Node.js 24 LTS genel bakış

V8 13.6 ile using/await using, --experimental-permission yerine geçen kararlı --permission bayrağı, framework gerektirmeyen yönlendirme için global URLPattern, npm 11 ve varsayılan HTTP istemcisi olarak Undici 7. En son yama sürümü 24.16.0'dır (Mayıs 2026).

Yetki Modeli: Deneysel Aşamadan Üretime Hazır Duruma

Node.js 20, Yetki Modeli'ni --experimental-permission bayrağı arkasında tanıttı. Node.js 24, experimental önekini kaldırıyor. Bayrak artık basitçe --permission olarak adlandırılıyor ve çalışma zamanı, açıkça izin verilmedikçe dosya sistemi, ağ, alt süreçler, yerel eklentiler ve ortam değişkenlerine erişimi kısıtlıyor.

Bu durum tedarik zinciri güvenliği açısından kritik önem taşıyor. Güvenliği aşılmış bir bağımlılık, süreç dar kapsamlı izinlerle --permission altında çalıştığında ağ üzerinden veri sızdıramaz veya rastgele dosyaları okuyamaz.

bash
# launch-secure.sh
# Run an API server with minimal permissions
node --permission \
  --allow-fs-read=/app/src,/app/config \
  --allow-fs-write=/app/uploads \
  --allow-net=0.0.0.0:3000 \
  server.js

Yukarıdaki süreç yalnızca kaynak ve yapılandırma dizinlerini okuyabilir, uploads klasörüne yazabilir ve 3000 portunu dinleyebilir. Bir alt süreç başlatma, yerel bir eklenti yükleme veya izin verilen kapsam dışındaki ortam değişkenlerine erişme girişimi ERR_ACCESS_DENIED hatası fırlatır.

process.permission ile Çalışma Zamanı Yetki Kontrolleri

process.permission.has() metodu çalışma zamanı introspeksiyonunu mümkün kılıyor. Uygulama kodu, kısıtlı işlemleri denemeden önce kendi yeteneklerini doğrulayabilir.

permission-check.jsjavascript
// Verify permissions before performing restricted operations
function ensureWriteAccess(directory) {
  if (!process.permission.has('fs.write', directory)) {
    throw new Error(`No write permission for ${directory}`);
  }
}

function canSpawnProcesses() {
  return process.permission.has('child');
}

// Gracefully degrade when network access is restricted
function fetchWithFallback(url, cachedData) {
  if (!process.permission.has('net')) {
    console.warn('Network access denied, using cached data');
    return cachedData;
  }
  return fetch(url);
}

Bu yaklaşım, hem korumalı alan hem de kısıtlanmamış ortamlarda çalışması gereken kütüphaneler için özellikle faydalıdır. Node.js 24.14.1 için Mart 2026 güvenlik yaması, FileHandle.chmod() ve FileHandle.chown() üzerindeki yetki kontrollerini atlayan bir güvenlik açığını da düzeltti ve çalışma zamanının güncel tutulmasının önemini bir kez daha vurguladı.

Global URLPattern: Bağımlılık Gerektirmeyen Yerel Rota Eşleştirme

Node.js 24, URLPattern API'sini global kapsamda sunuyor. Bu WHATWG standardı, adlandırılmış gruplar, opsiyonel segmentler ve doğrulama kısıtlamalarıyla URL'ler için özel olarak tasarlanmış, regex benzeri desen eşleştirmesi sağlıyor.

Herhangi bir import veya require gerekmez. API, tarayıcılarda, Cloudflare Workers'ta ve Deno'da aynı şekilde çalışır ve bu da onu gerçek anlamda taşınabilir bir yönlendirme ilkesi haline getirir.

router.jsjavascript
// Framework-free HTTP router using global URLPattern
const routes = [
  {
    pattern: new URLPattern({ pathname: '/api/users/:userId' }),
    handler: handleGetUser
  },
  {
    pattern: new URLPattern({ pathname: '/api/users/:userId/posts/:postId' }),
    handler: handleGetPost
  },
  {
    // Optional segment: matches /api/products and /api/products/:category
    pattern: new URLPattern({ pathname: '/api/products{/:category}?' }),
    handler: handleProducts
  }
];

function matchRoute(url) {
  for (const route of routes) {
    const result = route.pattern.exec(url);
    if (result) {
      return { handler: route.handler, params: result.pathname.groups };
    }
  }
  return null;
}

// Usage with Node.js HTTP server
import { createServer } from 'node:http';

const server = createServer((req, res) => {
  const url = new URL(req.url, `http://${req.headers.host}`);
  const match = matchRoute(url.href);

  if (match) {
    match.handler(req, res, match.params);
  } else {
    res.writeHead(404).end('Not Found');
  }
});

server.listen(3000);

Desen Doğrulama ve Gelişmiş Eşleştirme

URLPattern, adlandırılmış gruplarda satır içi regex kısıtlamalarını, protokol eşleştirmesini ve sunucu adı filtrelemesini destekler. test() metodu, bir eşleşme sonuç nesnesi ayırmadan hızlı kontroller için boolean döndürür.

url-validation.jsjavascript
// Validate URL segments with inline regex constraints
const numericUser = new URLPattern({ pathname: '/users/:id([0-9]+)' });
numericUser.test('https://app.com/users/42');    // true
numericUser.test('https://app.com/users/alice'); // false

// Match by protocol and hostname
const secureApi = new URLPattern({
  protocol: 'https',
  hostname: 'api.example.com',
  pathname: '/v2/*'
});

// Service worker-style routing for static assets vs API calls
const staticAssets = new URLPattern({ pathname: '/static/*' });
const apiCalls = new URLPattern({ pathname: '/api/*' });

Performans açısından URLPattern, ham verimlilik konusunda find-my-way gibi optimize edilmiş yönlendiricilerle rekabet etmek için tasarlanmamıştır. Değeri, çalışma zamanları arasındaki taşınabilirlik ve yol ayrıştırma hatalarını ortadan kaldıran standartlaştırılmış bir API'de yatmaktadır.

Node.js / NestJS mülakatlarında başarılı olmaya hazır mısın?

İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.

Açık Kaynak Yönetimi: using ve await using

Node.js 24'teki V8 13.6, TC39 Explicit Resource Management önerisini sunuyor. using ve await using bildirimleri, dosya tanıtıcıları, veritabanı bağlantıları, kilitler ve Symbol.dispose veya Symbol.asyncDispose uygulayan herhangi bir nesne için deterministik temizleme amacıyla try/finally bloklarının yerini alıyor.

Node.js 24.2.0 itibarıyla Symbol.dispose ve Symbol.asyncDispose artık deneysel değildir.

resource-management.jsjavascript
// Automatic cleanup with using and await using
import { open } from 'node:fs/promises';

async function processCSV(path) {
  // File handle is automatically closed when scope exits
  await using file = await open(path, 'r');
  const content = await file.readFile({ encoding: 'utf8' });
  return content.split('\n').length;
  // file[Symbol.asyncDispose]() called here automatically
}

// Custom disposable resource
function createDatabasePool(connectionString) {
  const pool = new Pool(connectionString);
  return {
    pool,
    query: (sql, params) => pool.query(sql, params),
    [Symbol.asyncDispose]: async () => {
      await pool.end();
      console.log('Pool connections released');
    }
  };
}

async function runMigrations() {
  await using db = createDatabasePool(process.env.DB_URL);
  await db.query('CREATE TABLE IF NOT EXISTS migrations ...');
  // Pool automatically closed, no try/finally needed
}

Birden Fazla Kaynak için DisposableStack

DisposableStack ve AsyncDisposableStack, birden fazla tek kullanımlık kaynağı bir araya getirir. Yığın atıldığında kaynaklar ters sırada serbest bırakılır ve bağımlılık zincirleri doğru şekilde ele alınır.

disposable-stack.jsjavascript
// Manage multiple resources with AsyncDisposableStack
async function processTransaction() {
  await using stack = new AsyncDisposableStack();

  const connection = stack.use(await getConnection());
  const transaction = stack.use(await connection.beginTransaction());
  const tempFile = stack.use(await createTempFile());

  await transaction.execute('INSERT INTO orders ...');
  await tempFile.write('backup data');

  // On scope exit: tempFile closed, transaction committed/rolled back,
  // connection returned to pool (reverse order)
}

Bu yaklaşım, kaynak sızıntısı hatalarının tüm bir sınıfını ortadan kaldırır. SuppressedError türü, atma işleminin kendisinin istisna fırlattığı uç durumu ele alarak hem orijinal hatayı hem de atma hatasını korur.

V8 13.6: Bilinmesi Gereken JavaScript Motoru Özellikleri

Açık kaynak yönetiminin ötesinde, V8 13.6, Node.js teknik mülakatlarında karşılaşılan birkaç özellik sunuyor.

RegExp.escape, kullanıcı girdilerini düzenli ifadelerde güvenli bir şekilde gömülmek üzere sanitize eder:

regexp-escape.jsjavascript
// Safely embed user input in regular expressions
const userInput = 'price: $9.99 (USD)';
const escaped = RegExp.escape(userInput);
// escaped: 'price\:\ \$9\.99\ \(USD\)'
const pattern = new RegExp(escaped);

Float16Array, ML çıkarımı veya WebGL tampon hazırlama gibi iş yükleri için Float32Array'e kıyasla bellek kullanımını yarıya indiren 16 bitlik kayan noktalı bir tipli dizi ekler:

float16.jsjavascript
// Half-precision floating point for memory-sensitive workloads
const weights = new Float16Array([0.5, -1.25, 3.14]);
console.log(weights.byteLength); // 6 bytes instead of 12 with Float32Array

Error.isError, alanlar arası (iframes, vm bağlamları, işçi iş parçacıkları) çalışan güvenilir bir tür kontrolü sağlar:

error-check.jsjavascript
// Cross-realm error detection
const err = new TypeError('invalid input');
Error.isError(err);           // true
Error.isError({ message: 'fake' }); // false

AsyncLocalStorage Performans İyileştirmesi

Node.js 24, AsyncLocalStorage'ı varsayılan olarak AsyncContextFrame uygulamasına geçiriyor. Önceki sürümler, her asenkron işleme ek yük ekleyen kanca tabanlı bir yaklaşım kullanıyordu. Yeni uygulama doğrudan V8'in mikro görev kuyruğuyla bütünleşerek yüksek eşzamanlılık uygulamalarında bağlam yayılımının performans maliyetini azaltıyor.

Bu değişiklik mevcut kod için şeffaftır. İstek kapsamlı bağlam için AsyncLocalStorage'a dayanan OpenTelemetry gibi kütüphaneler ve loglama çerçeveleri, kod değişikliği gerektirmeden ölçülebilir verimlilik iyileştirmeleri elde eder.

async-context.jsjavascript
// Request-scoped context with improved AsyncLocalStorage
import { AsyncLocalStorage } from 'node:async_hooks';

const requestContext = new AsyncLocalStorage();

function handleRequest(req, res) {
  const context = {
    requestId: crypto.randomUUID(),
    startTime: performance.now()
  };

  requestContext.run(context, async () => {
    // Context automatically propagated through all async operations
    const data = await fetchUserData(req.userId);
    const elapsed = performance.now() - requestContext.getStore().startTime;
    logger.info(`Request ${requestContext.getStore().requestId} completed in ${elapsed}ms`);
    res.json(data);
  });
}

Mülakat Soruları: Node.js 24 Edisyonu

Bu sorular, 2026'da mülakatlarda hedeflenen özellikleri ve kalıpları yansıtıyor. Her cevap, yüzeysel bilgi yerine üretim düzeyinde anlayışı gösteriyor.

S1: Node.js Yetki Modeli, işletim sistemi düzeyindeki korumalı alandan nasıl farklıdır?

Yetki Modeli, işletim sistemi çekirdeği düzeyinde değil, Node.js çalışma zamanı düzeyinde çalışır. CLI bayraklarına dayalı olarak Node.js yerleşik API'lerine (fs, net, child_process) erişimi kısıtlar. İşletim sistemi düzeyinde korumalı alan (konteynerler, seccomp, AppArmor) çalışma zamanının altında çalışır ve sistem çağrılarını kısıtlar. Yetki Modeli, uygulama düzeyinde ayrıntılılık sağlayarak işletim sistemi korumalı alanını tamamlar. Önemli bir sınırlama: Node.js API'lerini atlayan yerel eklentiler için geçerli değildir ve yetki kontrolünden önce açılan mevcut dosya tanıtıcıları hala kullanılabilir.

S2: URLPattern, özel bir yönlendiriciye kıyasla ne zaman kötü bir tercih olur?

URLPattern, ara yazılım desteğinden, metot tabanlı yönlendirmeden (GET vs POST) ve rota sıralama garantilerinden yoksundur. Bir desen dizisi üzerinde iterasyon yaparken doğrusal eşleştirme gerçekleştirir; find-my-way gibi yönlendiriciler ise O(log n) aramaları için radix ağaçları kullanır. URLPattern, paylaşılan istemci-sunucu doğrulama mantığı, service worker fetch işleyicileri ve prototipler için uygundur. Yüzlerce rotaya sahip üretim HTTP API'leri, özel bir yönlendiriciden fayda görür.

S3: using ile await using arasındaki farkı açıklayınız. Her biri ne zaman uygundur?

using, bloktan çıkıldığında [Symbol.dispose]() fonksiyonunu senkron olarak çağırır. Mutex'ler, senkron C++ eklentileri tarafından yönetilen dosya tanıtıcıları veya bellek içi önbellekler gibi kaynaklar için çalışır. await using, [Symbol.asyncDispose]() fonksiyonunu çağırır ve sonucu bekler; bu da veritabanı bağlantıları, HTTP oturumları veya asenkron I/O içeren herhangi bir temizleme için gereklidir. Asenkron bir kaynak için senkron using kullanmak, temizlemeyi sessizce atlar.

S4: AsyncContextFrame, AsyncLocalStorage performansını nasıl iyileştirir?

Önceki uygulamalar, bağlamı yaymak için asenkron kancalar (init, before, after, destroy) kullanıyordu ve her Promise çözümlemesine ve zamanlayıcı geri çağırmasına ek yük ekliyordu. AsyncContextFrame, bağlamı doğrudan V8'in dahili promise zincirinde saklar ve kanca ek yükünü ortadan kaldırır. İyileştirme, istek başına izleme ile binlerce eşzamanlı isteği ele alan HTTP sunucuları gibi yüksek Promise devir hızına sahip iş yüklerinde en belirgindir.

S5: Yetki Modelinde hangi güvenlik sınırlamaları mevcuttur?

Beş kritik sınırlama: (1) Sembolik bağlantılar, izin verilen yolların dışına geçebilir. (2) Yerel eklentiler, yetki kontrollerini tamamen atlar. (3) Bir üst süreçten devralınan veya --permission başlatılmadan önce açılan dosya tanıtıcıları kısıtlanmaz. (4) --env-file ve --openssl-config bayrakları, Yetki Modeli başlatılmadan önce dosyaları okur. (5) İşçi iş parçacığı yetkileri bağımsızdır ve ayrı ayrı yapılandırılmalıdır. FileHandle.chmod()/FileHandle.chown() için Mart 2026 CVE düzeltmesi, yeni API'lerin yetki uygulaması açısından sürekli denetlenmesi gerektiğini gösterdi.

Pratik yapmaya başla!

Mülakat simülatörleri ve teknik testlerle bilgini test et.

Sonuç

  • Yükseltme yolu: Node.js 24 LTS (Krypton), Nisan 2028'e kadar önerilen üretim sürümüdür. --permission bayrağı kod değişikliği gerektirmez, yalnızca dağıtım yapılandırması gerektirir
  • URLPattern, çalışma zamanları arası kod için hafif yönlendirme bağımlılıklarını ortadan kaldırır. Karmaşık ara yazılım zincirleri olan yüksek verimli HTTP API'leri için özel yönlendiriciler tercih edilmelidir
  • using/await using, kaynak yaşam döngüsü yönetimi için try/finally'ın yerini alır. Veritabanı havuz sarmalayıcılarına ve dosya tanıtıcı yardımcı araçlarına [Symbol.asyncDispose] ekleyerek başlanabilir
  • AsyncLocalStorage performans iyileştirmeleri otomatiktir. Yük altında istek kapsamlı loglama ve izlemenin karşılaştırmalı testi ile doğrulanabilir
  • Mülakat hazırlığı, Yetki Modeli'nin sınırlamalarını (sembolik bağlantılar, yerel eklentiler, devralınan dosya tanıtıcıları), URLPattern'in radix ağacı yönlendiricilerine karşı ödünleşimlerini ve senkron ile asenkron atma arasındaki ayrımı kapsamalıdır
  • Özel tek kullanımlık kaynaklar ve çalışma zamanı yetki kontrolleri uygulamak, backend mülakat oturumlarında Node.js 24 özelliklerine hakimiyet göstermenin etkili bir yoludur

Pratik yapmaya başla!

Mülakat simülatörleri ve teknik testlerle bilgini test et.

Etiketler

#node.js
#node.js 24
#urlpattern
#permissions
#interview
#v8
#javascript

Paylaş

İlgili makaleler