path y url
node:path construye rutas del sistema de archivos; node:url analiza y resuelve URLs HTTP y file:// - confundirlos causa importaciones rotas, redirecciones incorrectas y errores SSRF.
Busca en todas las páginas de la documentación
node:path construye rutas del sistema de archivos; node:url analiza y resuelve URLs HTTP y file:// - confundirlos causa importaciones rotas, redirecciones incorrectas y errores SSRF.
import path from 'node:path';
import { fileURLToPath } from 'node:url';
const dir = path.dirname(fileURLToPath(import.meta.url));
const config = path.join(dir, 'config.json');import { URL } from 'node:url';
const u = new URL('https://api.example.com/v1/users?page=2');
u.searchParams.set('limit', '50');Cuándo usarlo:
dist/ compiladaimport.meta.url a una ruta de sistema de archivos absolutaimport path from 'node:path';
import { fileURLToPath, URL } from 'node:url';
// Equivalente a __dirname en ESM
const root = path.dirname(fileURLToPath(import.meta.url));
const dataFile = path.resolve(root, '..', 'data', 'users.json');
// URL de API con construcción segura de consultas
function usersEndpoint(base: string, page: number): string {
const url = new URL('/v1/users', base);
url.searchParams.set('page', String(page));
return url.href;
}
// Protección SSRF - solo permite https a un host conocido
function assertAllowedTarget(href: string, allowedHosts: Set<string>): URL {
const parsed = new URL(href);
if (parsed.protocol !== 'https:') throw new Error('https requerido');
if (!allowedHosts.has(parsed.hostname)) throw new Error('host no permitido');
return parsed;
}Lo que esto demuestra:
path.resolve y join previenen errores manuales de barrasURL resuelve rutas relativas contra una URL basesearchParams codifica las cadenas de consulta correctamenteprotocol y hostname antes de fetchwin32 vs posix) - path.join elige separadores.URL del navegador.| Tarea | Módulo |
|---|---|
| Unir directorio de configuración | path.join |
| Analizar cadena de consulta en URL HTTP | URL |
| Clave de objeto S3 | path.posix.join |
| Normalizar URL de redirección | new URL(input, base) |
import path from 'node:path';
export function safeJoin(base: string, userSegment: string): string {
const resolved = path.resolve(base, userSegment);
if (!resolved.startsWith(path.resolve(base))) {
throw new Error('path traversal');
}
return resolved;
}URL para HTTP, path para disco.path.join(base, userInput) - ../etc/passwd. Solución: resolver y verificar el prefijo bajo la base.url.pathname es una ruta del sistema de archivos en Windows - barra inicial tipo POSIX. Solución: fileURLToPath solo para URLs file:.new URL(relative, base).new URL maneja el host entre corchetes http://[::1]:8080.| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
URL.canParse | Comprobación rápida de validez | Necesitas unir rutas del sistema de archivos |
path-to-regexp | Patrones de ruta de Express | Análisis general de URL |
| Cadenas de plantilla sin procesar | Nunca para entrada de usuario | - |
| URL WHATWG en fetch | Salida del cliente | Rutas de archivos locales |
path.dirname(fileURLToPath(import.meta.url)).
resolve absolutiza desde la derecha; join solo concatena - usa resolve para rutas relativas al usuario con protección.
new URL('http://x?' + qs) o url.searchParams - no dividir manualmente para valores codificados.
fileURLToPath convierte a C:\... correctamente con el formato de tres barras.
Valida la lista de permitidos del nombre de host antes de la obtención del lado del servidor - consulta Guardias SSRF.
Sí, para claves S3 y rutas tipo URL almacenadas como rutas posix.
Jest/Vitest configuran import meta - las rutas aún se resuelven en relación con el módulo de prueba.
searchParams.set codifica una vez - no pre-codifiques los valores.
Obsoleto - usa el constructor URL de WHATWG.
new URL('/api', 'https://x.com/v1/') - la ruta base importa - prueba con cuidado.
El framework maneja los parámetros de ruta - usa URL solo para llamadas salientes.
Las rutas del contenedor son Linux - usa posix dentro del contenedor independientemente del SO de desarrollo.
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026