# Node.js 24 in 2026: URLPattern, Permission Model en Sollicitatievragen > Node.js 24 LTS brengt een stabiel Permission Model, globale URLPattern API, expliciet resourcebeheer met using/await using en V8 13.6. Een diepgaande analyse van de functies die relevant zijn voor productie en technische sollicitatiegesprekken. - Published: 2026-05-31 - Updated: 2026-05-31 - Author: SharpSkill - Tags: node.js, node.js 24, urlpattern, permissions, interview, v8, javascript - Reading time: 10 min --- Node.js 24, codenaam Krypton, bereikte LTS-status in oktober 2025 en blijft de aanbevolen productieversie in 2026. Deze release stabiliseert het Permission Model, promoveert URLPattern tot een globale API, introduceert expliciet resourcebeheer via V8 13.6 en upgradet npm naar versie 11. Deze wijzigingen hebben directe invloed op de manier waarop backend-applicaties beveiliging, routing en de levenscyclus van resources afhandelen. > **Node.js 24 LTS in het kort** > > V8 13.6 met `using`/`await using`, stabiele `--permission`-vlag als vervanging voor `--experimental-permission`, globaal `URLPattern` voor routing zonder framework, npm 11 en Undici 7 als standaard HTTP-client. De laatste patch is 24.16.0 (mei 2026). ## Het Permission Model: Van Experimenteel naar Productieklaar Node.js 20 introduceerde het Permission Model achter de vlag `--experimental-permission`. Node.js 24 verwijdert het prefix `experimental`. De vlag heet nu simpelweg `--permission`, en de runtime beperkt de toegang tot het bestandssysteem, netwerk, kindprocessen, native addons en omgevingsvariabelen tenzij expliciet toegestaan. Dit is van belang voor supply chain-beveiliging. Een gecompromitteerde dependency kan geen gegevens exfiltreren via het netwerk of willekeurige bestanden lezen als het proces draait onder `--permission` met nauwkeurig afgebakende rechten. ```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 ``` Het bovenstaande proces kan alleen de bron- en configuratiemappen lezen, naar de uploadmap schrijven en luisteren op poort 3000. Elke poging om een kindproces te starten, een native addon te laden of omgevingsvariabelen buiten het toegestane bereik te benaderen, resulteert in een `ERR_ACCESS_DENIED`-fout. ### Runtime-rechtencontrole met process.permission De methode `process.permission.has()` maakt runtime-introspectie mogelijk. Applicatiecode kan de eigen mogelijkheden verifiëren voordat beperkte operaties worden uitgevoerd. ```javascript // permission-check.js // 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); } ``` Dit patroon is bijzonder nuttig voor bibliotheken die zowel in sandbox-omgevingen als in onbeperkte omgevingen moeten functioneren. De beveiligingspatch van maart 2026 voor Node.js 24.14.1 verholp ook een bypass in `FileHandle.chmod()` en `FileHandle.chown()` waarbij rechtencontroles werden overgeslagen, wat het belang van regelmatige updates benadrukt. ## Globaal URLPattern: Native Route Matching Zonder Dependencies Node.js 24 maakt [URLPattern](https://developer.mozilla.org/en-US/docs/Web/API/URLPattern) beschikbaar in de globale scope. Deze WHATWG-standaard biedt regex-achtige patroonherkenning speciaal ontworpen voor URL's, met benoemde groepen, optionele segmenten en validatiebeperkingen. Geen `import` of `require` is nodig. De API werkt identiek in browsers, Cloudflare Workers en Deno, wat het een werkelijk portable routing-primitief maakt. ```javascript // router.js // 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); ``` ### Patroonvalidatie en Geavanceerde Matching URLPattern ondersteunt inline regex-beperkingen op benoemde groepen, protocolmatching en hostnamefiltering. De methode `test()` retourneert een boolean voor snelle controles zonder een match-resultaatobject te alloceren. ```javascript // url-validation.js // 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/*' }); ``` Qua prestaties is URLPattern niet ontworpen om te concurreren met geoptimaliseerde routers zoals [find-my-way](https://github.com/delvedor/find-my-way) in ruwe doorvoer. De waarde ligt in de portabiliteit tussen runtimes en een gestandaardiseerde API die pad-parsingfouten elimineert. ## Expliciet Resourcebeheer: using en await using V8 13.6 in Node.js 24 levert het TC39-voorstel [Explicit Resource Management](https://github.com/tc39/proposal-explicit-resource-management). De declaraties `using` en `await using` vervangen `try/finally`-blokken voor de deterministische opruiming van bestandshandles, databaseverbindingen, locks en elk object dat `Symbol.dispose` of `Symbol.asyncDispose` implementeert. Vanaf Node.js 24.2.0 zijn `Symbol.dispose` en `Symbol.asyncDispose` niet langer experimenteel. ```javascript // resource-management.js // 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 } ``` ### DisposableStack voor Meerdere Resources `DisposableStack` en `AsyncDisposableStack` aggregeren meerdere disposable resources. Wanneer de stack wordt opgeruimd, worden resources in omgekeerde volgorde vrijgegeven, waarbij afhankelijkheidsketens correct worden afgehandeld. ```javascript // disposable-stack.js // 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) } ``` Dit patroon elimineert een hele klasse van resource-lekbugs. Het type `SuppressedError` behandelt het randgeval waarbij de opruiming zelf een fout veroorzaakt, en bewaart zowel de oorspronkelijke fout als de opruimingsfout. ## V8 13.6: JavaScript Engine-functies om te Kennen Naast expliciet resourcebeheer introduceert V8 13.6 verschillende functies die voorkomen in [technische Node.js-interviews](/technologies/node-nestjs). **RegExp.escape** sanitiseert strings voor veilige inbedding in reguliere expressies: ```javascript // regexp-escape.js // 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** voegt een 16-bit floating-point typed array toe, wat het geheugengebruik halveert vergeleken met `Float32Array` voor workloads zoals ML-inferentie of WebGL-buffervoorbereiding: ```javascript // float16.js // 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** biedt een betrouwbare typecontrole die werkt over realms heen (iframes, vm-contexten, worker threads): ```javascript // error-check.js // Cross-realm error detection const err = new TypeError('invalid input'); Error.isError(err); // true Error.isError({ message: 'fake' }); // false ``` ## AsyncLocalStorage: Prestatieverbetering Node.js 24 schakelt `AsyncLocalStorage` standaard over naar de `AsyncContextFrame`-implementatie. Eerdere versies gebruikten een hook-gebaseerde aanpak die overhead toevoegde aan elke asynchrone operatie. De nieuwe implementatie integreert rechtstreeks met de microtask-wachtrij van V8, waardoor de prestatiekosten van contextpropagatie in applicaties met hoge concurrency worden verlaagd. Deze wijziging is transparant voor bestaande code. Bibliotheken zoals [OpenTelemetry](https://opentelemetry.io/) en logging-frameworks die afhankelijk zijn van `AsyncLocalStorage` voor request-gebonden context ervaren meetbare doorvoerverbeteringen zonder codewijzigingen. ```javascript // async-context.js // 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); }); } ``` ## Sollicitatievragen: Node.js 24 Editie Deze vragen weerspiegelen de functies en patronen waarop interviewers zich richten in 2026. Elk antwoord toont een productieklaar begrip in plaats van oppervlakkige kennis. **V1: Hoe verschilt het Node.js Permission Model van sandboxing op besturingssysteemniveau?** Het Permission Model werkt op het niveau van de Node.js-runtime, niet op het niveau van de OS-kernel. Het beperkt de toegang tot Node.js built-in API's (`fs`, `net`, `child_process`) op basis van CLI-vlaggen. Sandboxing op OS-niveau (containers, seccomp, AppArmor) werkt onder de runtime en beperkt syscalls. Het Permission Model vormt een aanvulling op OS-sandboxing door granulariteit op applicatieniveau te bieden. Een belangrijke beperking: het geldt niet voor native addons die Node.js API's omzeilen, en bestaande file descriptors die geopend zijn voor de rechtencontrole kunnen nog steeds worden gebruikt. **V2: Wanneer is URLPattern een slechte keuze vergeleken met een dedicated router?** URLPattern biedt geen middleware-ondersteuning, geen methodegebaseerde routing (GET vs POST) en geen garanties voor de volgorde van routes. Het voert lineaire matching uit bij het itereren over een array van patronen, terwijl routers zoals [find-my-way](https://github.com/delvedor/find-my-way) radix-bomen gebruiken voor O(log n) lookups. URLPattern is geschikt voor gedeelde client-server-validatielogica, service worker fetch handlers en prototypes. Productie-HTTP-API's met honderden routes profiteren van een dedicated router. **V3: Wat is het verschil tussen `using` en `await using`? Wanneer is elk gepast?** `using` roept `[Symbol.dispose]()` synchroon aan wanneer het blok wordt verlaten. Het werkt voor resources zoals mutexen, file descriptors beheerd door synchrone C++-addons of in-memory caches. `await using` roept `[Symbol.asyncDispose]()` aan en wacht op het resultaat, wat noodzakelijk is voor databaseverbindingen, HTTP-sessies of elke opruiming met asynchrone I/O. Het gebruik van synchroon `using` voor een asynchrone resource slaat de opruiming stilzwijgend over. **V4: Hoe verbetert `AsyncContextFrame` de prestaties van `AsyncLocalStorage`?** Eerdere implementaties gebruikten async hooks (`init`, `before`, `after`, `destroy`) om de context te propageren, wat overhead toevoegde aan elke `Promise`-resolutie en timer-callback. `AsyncContextFrame` slaat de context direct op in de interne promise-keten van V8, waardoor de hook-overhead wordt geëlimineerd. De verbetering is het meest significant bij workloads met hoge `Promise`-churn, zoals HTTP-servers die duizenden gelijktijdige verzoeken verwerken met per-request tracing. **V5: Welke beveiligingsbeperkingen bestaan er in het Permission Model?** Vijf kritieke beperkingen: (1) Symlinks kunnen paden buiten de toegestane directories traverseren. (2) Native addons omzeilen rechtencontroles volledig. (3) File descriptors die zijn overgeërfd van een ouderproces of geopend voor de `--permission`-initialisatie zijn niet beperkt. (4) De vlaggen `--env-file` en `--openssl-config` lezen bestanden voordat het Permission Model wordt geïnitialiseerd. (5) Worker thread-rechten zijn onafhankelijk en moeten apart worden geconfigureerd. De CVE-fix van maart 2026 voor `FileHandle.chmod()`/`FileHandle.chown()` toonde aan dat nieuwe API's continu moeten worden gecontroleerd op de handhaving van rechten. ## Conclusie - **Upgradepad**: Node.js 24 LTS (Krypton) is de aanbevolen productieversie tot april 2028. De `--permission`-vlag vereist geen codewijzigingen, alleen deploymentconfiguratie - **URLPattern** elimineert lichtgewicht routing-dependencies voor cross-runtime code. Dedicated routers blijven de betere keuze voor high-throughput HTTP-API's met complexe middleware-ketens - **`using`/`await using`** vervangen `try/finally` voor het beheer van de levenscyclus van resources. Een goed startpunt is het toevoegen van `[Symbol.asyncDispose]` aan database pool-wrappers en bestandshandle-utilities - De prestatieverbetering van **AsyncLocalStorage** is automatisch. Verificatie is mogelijk door benchmarking van request-gebonden logging en tracing onder belasting - **Sollicitatievoorbereiding** moet de beperkingen van het Permission Model (symlinks, native addons, overgeërfde file descriptors), de afwegingen van URLPattern versus radix-tree routers en het onderscheid tussen synchrone en asynchrone opruiming omvatten - Het implementeren van aangepaste disposable resources en runtime-rechtencontroles toont praktische ervaring met Node.js 24-functies tijdens [backend-sollicitatiegesprekken](/technologies/node-nestjs/interview-questions/authentication-jwt) --- Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack. HTML version of this page: https://sharpskill.dev/nl/blog/node-nestjs/nodejs-24-urlpattern-permissions-interview-questions